1. 程式人生 > >Linux 獲取檔案屬性 函式 stat, fstat, lstat 以及 stat 結構體

Linux 獲取檔案屬性 函式 stat, fstat, lstat 以及 stat 結構體

linux程式設計裡,有三個函式可以獲取 檔案的屬性(包含了檔案型別和檔案許可權等屬性)。

三個函式的原型如下:

#include <sys/stat.h>

int stat(const char *restrict pathname, struct stat *restrict buf);

int fstat(int filedes, struct stat *restrict buf);

int lstat(const char *restrict pathname, struct stat *resstrict buf);

在這三個函式中,都用到了stat 結構體, 這裡就介紹一下stat結構體。

struct stat

{

    mode_t   st_mode;      //檔案訪問許可權,型別

    ino_t        st_ino;          //索引節點號

    dev_t       st_dev;         //檔案所在裝置的裝置號

    dev_t       st_rdev;       //檔案inode所代表的裝置的裝置號。

    nlink_t     st_nlink;      //硬連結數

    uid_t        st_uid;         //檔案所有者 使用者ID

    gid_t        st_gid;         //檔案所在組 組ID

    off_t         st_size;        //普通檔案,檔案大小, Bytes

    time_t      st_atime;     //檔案被最後訪問(access)的時間

    time_t      st_mtime;    //檔案內容最後被修改(modify)的時間

    time_t      st_ctime;     //檔案狀態最後被修改的時間( status change)

    blksize_t st_blksize;     //檔案所在磁碟的磁碟塊大小

    blkcnt_t   st_blocks;      //檔案佔用塊數量

};

通過一下的帶參巨集定義我們可以通過 st_mode引數判斷出檔案的型別:

S_ISREG(m)      : 是否是普通檔案。

S_ISDIR(m)       : 是否是目錄

S_ISCHR(m)     : 是否是字元裝置

S_ISBLK(m)      : 是否是塊裝置

S_ISFIFO(m)      : 是否是FIFO(命名管道?)

S_ISLNK(m)      : 是否是連結

S_ISSOCK(m)   : 是否是socket

另外對於檔案的讀寫屬性也有如下的巨集定義:

S_IRUSR  :所有者-讀

S_IWUSR  :所有者-寫

S_IXUSR   :所有者-執行

S_IRGRP  : 組-讀

S_IWGRP  : 組-寫

S_IXGRP  :組-執行

S_IROTH  :其他-讀

S_IWOTH  :其他-寫

S_IXOTH  :其他-執行


講完了,stat函式 中最重要的出參 struct stat, 接下來就講下 函式的返回值

函式返回值:

成功執行返回為0,  如果失敗則返回-1, 並且置errno。

errno型別:

EACCES: 搜尋許可權被拒絕。

EBADF   : fd有誤

EFAULT  : 地址有誤

ELOOP    : 遍歷路徑時遇到太多的符號連線

ENAMETOOLONG  : path 太長

ENOENT  : 路徑path為空,或者路徑有誤。

ENOMEM : no memory

ENOTDIR : 路徑非法,其中路徑中有不是目錄的部分。

然後, stat, fstat, 和lstat 之間的區別是什麼呢?

通過函式原型,我們也可以知道一二。

對於stat,它可以僅僅通過檔案地址,獲取檔案屬性,而不一定要開啟檔案; 而fstat 需要將檔案開啟,獲取fd,然後通過fd來獲取檔案的stat。

對於連結檔案, stat獲取的檔案屬性是被連結檔案的檔案屬性,而lstat獲取的則是連結檔案本身的檔案屬性。

示例:(來自於http://linux.die.net/man/2/stat)

#include <sys/types.h>
#include <sys/stat.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>

int
main(int argc, char *argv[])
{
    struct stat sb;

   if (argc != 2) {
        fprintf(stderr, "Usage: %s <pathname>\n", argv[0]);
        exit(EXIT_FAILURE);
    }

   if (stat(argv[1], &sb) == -1) {
        perror("stat");
        exit(EXIT_FAILURE);
    }

   printf("File type:                ");

   switch (sb.st_mode & S_IFMT) {
    case S_IFBLK:  printf("block device\n");            break;
    case S_IFCHR:  printf("character device\n");        break;
    case S_IFDIR:  printf("directory\n");               break;
    case S_IFIFO:  printf("FIFO/pipe\n");               break;
    case S_IFLNK:  printf("symlink\n");                 break;
    case S_IFREG:  printf("regular file\n");            break;
    case S_IFSOCK: printf("socket\n");                  break;
    default:       printf("unknown?\n");                break;
    }

   printf("I-node number:            %ld\n", (long) sb.st_ino);

   printf("Mode:                     %lo (octal)\n",
            (unsigned long) sb.st_mode);

   printf("Link count:               %ld\n", (long) sb.st_nlink);
    printf("Ownership:                UID=%ld   GID=%ld\n",
            (long) sb.st_uid, (long) sb.st_gid);

   printf("Preferred I/O block size: %ld bytes\n",
            (long) sb.st_blksize);
    printf("File size:                %lld bytes\n",
            (long long) sb.st_size);
    printf("Blocks allocated:         %lld\n",
            (long long) sb.st_blocks);

   printf("Last status change:       %s", ctime(&sb.st_ctime));
    printf("Last file access:         %s", ctime(&sb.st_atime));
    printf("Last file modification:   %s", ctime(&sb.st_mtime));

   exit(EXIT_SUCCESS);
}

上述示例中的, S_IF* (S_IFBLK, ....)可以通過 sb.st_mode & S_IFMT 來獲取,也可以通過 上邊介紹的那些巨集定義S_ISREG(m)來獲取。

在我現在嘗試寫的一個webserver 小程式裡,就需要通過 stat 來判斷 檔案是否存在, 檔案是否可以執行。

inline int IsExecutable(mode_t mode)

{

      return (mode & S_IXOTH );

}.

本文有部分內容來自於:http://linux.die.net/man/2/stat。

相關推薦

Linux 獲取檔案屬性 函式 stat fstat lstat 以及 stat 結構

linux程式設計裡,有三個函式可以獲取 檔案的屬性(包含了檔案型別和檔案許可權等屬性)。 三個函式的原型如下: #include <sys/stat.h> int stat(const char *restrict pathname, struct sta

Linux獲取檔案屬性stat()、fstat()、lstat()函式例項學習

/* file stat example */ #include <stdio.h> #include <unistd.h> #include <sys/stat.h> #include <sys/types.h> #includ

Linux學習筆記】獲取檔案屬性stat()、fstat()、lstat()小結

相關文章 Linux是基於檔案的作業系統,一切皆檔案。下面就詳細的整理一下關於Linux檔案屬性的內容。 一、檔案屬性函式 系統提供了3個獲取檔案屬性的函式,分別是:stat()、fstat()、lstat()。 1、函式原型   標頭檔案包含:

linux系統呼叫函式 lstat--獲取檔案屬性

所需標頭檔案: #include<unistd.h> #include<sys/stat.h> #include<sys/types.h> 函式功能:用來獲取linux作業系統下檔案的屬性。 函式原型: int st

獲取檔案屬性statlstatfstat

一、函式原型                 #include <sys/types.h>                 #include <sys/stat.h>                 #include <unistd.h>

檔案屬性函式stat/fstat/lstat

stat,lstat,fstat1 函式都是獲取檔案(普通檔案,目錄,管道,socket,字元,塊()的屬性。函式原型#include <sys/stat.h>int stat(const char *restrict pathname, struct stat

嵌入式Linux標準IO獲取檔案大小fgetc()定位流獲取檔案大小fteel()、rewind()/fseek()處理錯誤資訊perror()/strerror()

#include <stdio.h> #include <errno.h> #include <string.h> int get_file_size(const char *file); int main(int argc, const char *a

Linux檔案屬性獲取

1. 資料結構和系統呼叫 在Linux下進行C/C++程式設計,主要通過以下三個系統呼叫來獲取檔案(普通檔案,目錄,管道,socket,字元,塊等)屬性。 標頭檔案“#include <sys/stat.h>” (1) //通過檔名稱獲取檔案屬性 int sta

Linux 修改檔案屬性檔案使用者組所有者

修改檔案屬性許可權1.利用數字型別修改許可權chmod [-R] xyz filename|dirname -R:表示遞迴修改Linux檔案的基本許可權有9個,分別是owner,group,others三種身份各自的read,write,execute許可權,3個一組.可以

js獲取物件屬性的兩種方法object.屬性[‘屬性名’ ]

1、通過點的方式 2、通過括號的方式 例: <input type="text" value="hello" id="text"/> var oText = document.getElementById("text") (1)通過點的方式   oText.pr

Linux修改檔案屬性以及許可權

原文連結:Linux修改檔案屬性以及許可權 chgrp:改變檔案所屬使用者組 chown:改變檔案所有者 chmod改變檔案的許可權 下圖我是新建了一個text.txt文件,然後ls顯示。看到了這個檔案所有者以及檔案所屬使用者組都是somnus,然後修改檔案所屬使用

linux檔案同步函式(fflush、sync、fsync、fdatasync)之間差異

遇到機器異常關機時,寫log檔案資訊丟失問題,所以記錄下。   Linux實現中在核心設有緩衝區快取記憶體或頁面快取記憶體,大多數磁碟I/O都通過緩衝區進行。當我們向檔案寫資料時,核心通常先將資料複製到一個緩衝區中,如果該緩衝區尚未寫滿,則並不將其排入輸出佇列,而是等待寫滿或者核心需要重用該

linux檔案屬性與目錄配置

三個重要檔案: /etc/passwd    系統上的賬號與一般身份使用者,還有那個 root 的相關資訊/etc/shadow    密碼/etc/group    &nbs

Python3 獲取檔案屬性(時間、大小等)

%y 兩位數的年份表示(00-99) %Y 四位數的年份表示(000-9999) %m 月份(01-12) %d 月內中的一天(0-31) %H 24小時制小時數(0-23) %I 12小時制小時數(01-12) %M 分鐘數(00=59) %S 秒(00-59) %a本地簡化星期名稱 %A 本地完整星期名

使用ShellClass獲取檔案屬性詳細資訊

首先引用COM元件         Microsoft Shell Controls And Automation      這裡需要注意         DLL的屬性Embed Interop Type 設為False      否則會引起互操作型別異常  

linux系統呼叫open、write、close、read以及stat函式詳解

學習筆記 參考連結1 、參考連結2以及百度百科 在進行C語言學習的時候我們瞭解到了C語言相關的一些IO操作,如fopen,fwrite,fread,fprintf,fclose等相關函式,他們都是由C庫函式提供的一些函式,是將作業系

linux檔案屬性

檔案屬性 67603664 -rw-r--r-- 1 root root 225 Dec 4 14:56 test.log inode  檔案型別  許可權  硬連結數  屬主  屬組  檔案大小  檔案修改時間&nbs

linux獲取檔案大小

摘自:  http://os.51cto.com/art/200912/168700.html 在我們學習生活中經常會遇到問題和困難,就比如說我們在學習Linux時,比如怎樣Linux獲取檔案大小的方法。前幾天在工作中需要寫一段程式碼,獲取一些視訊檔案的大小,心想:這還不

Linux獲取檔案資訊

參考手冊:http://man7.org/linux/man-pages/man2/stat.2.html 基本使用方式: int stat(const char *pathname, struct stat *statbuf); int lstat(const char *pa

Linux修改檔案屬性及許可權

修改檔案使用者組: (組名必須在/etc/group檔案中) chgrp [-R] grpname filename|dirname -R:將目錄內檔案的所屬組都改為指定組名 eg: 修