1. 程式人生 > >Linux中用st_mode判斷檔案型別

Linux中用st_mode判斷檔案型別

在Linux中,可以利用stat()函式來獲取一個檔案的狀態
#include <sys/stat.h>
#include <unistd.h>

int stat(const char *file_name, struct stat *buf);
這個函式執行成功返回0,失敗返回-1。取得的檔案狀態存放在buf指標指向的struct stat結構提中, struct stat的定義如下:
struct stat  
{  
    dev_t       st_dev;     /* ID of device containing file -檔案所在裝置的ID*/  
    ino_t       st_ino;     /* inode number -inode節點號*/
    mode_t      st_mode;    /* 檔案的型別和存取的許可權*/  
    nlink_t     st_nlink;   /* number of hard links -鏈向此檔案的連線數(硬連線)*/  
    uid_t       st_uid;     /* user ID of owner -user id*/  
    gid_t       st_gid;     /* group ID of owner - group id*/  
    dev_t       st_rdev;    /* device ID (if special file) -裝置號,針對裝置檔案*/  
    off_t       st_size;    /* total size, in bytes -檔案大小,位元組為單位*/  
    blksize_t   st_blksize; /* blocksize for filesystem I/O -系統塊的大小*/  
    blkcnt_t    st_blocks;  /* number of blocks allocated -檔案所佔塊數*/  
    time_t      st_atime;   /* time of last access -最近存取時間*/  
    time_t      st_mtime;   /* time of last modification -最近修改時間*/  
    time_t      st_ctime;   /* time of last status change - */  
};  

其中, st_mode這個變數用來判斷檔案型別。

st_mode是用特徵位來表示檔案型別的,特徵位的定義如下:

S_IFMT      0170000     檔案型別的位遮罩
S_IFSOCK    0140000     socket
S_IFLNK     0120000     符號連結(symbolic link)
S_IFREG     0100000     一般檔案
S_IFBLK     0060000     區塊裝置(block device)
S_IFDIR     0040000     目錄
S_IFCHR     0020000     字元裝置(character device)
S_IFIFO     0010000     先進先出(fifo)
S_ISUID     0004000     檔案的(set user-id on execution)位
S_ISGID     0002000     檔案的(set group-id on execution)位
S_ISVTX     0001000     檔案的sticky位
S_IRWXU     00700       檔案所有者的遮罩值(即所有許可權值)
S_IRUSR     00400       檔案所有者具可讀取許可權
S_IWUSR     00200       檔案所有者具可寫入許可權
S_IXUSR     00100       檔案所有者具可執行許可權
S_IRWXG     00070       使用者組的遮罩值(即所有許可權值)
S_IRGRP     00040       使用者組具可讀取許可權
S_IWGRP     00020       使用者組具可寫入許可權
S_IXGRP     00010       使用者組具可執行許可權
S_IRWXO     00007       其他使用者的遮罩值(即所有許可權值)
S_IROTH     00004       其他使用者具可讀取許可權
S_IWOTH     00002       其他使用者具可寫入許可權
S_IXOTH     00001       其他使用者具可執行許可權
摘自《Linux C 函式庫參考手冊》

判斷檔案型別時,用對檔案的st_mode的值與上面給出的值相與,再比較。比如:

#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>

int main()
{
    int abc;
    struct stat buf;
    stat("/home", &buf);
    abc = buf.st_mode & S_IFDIR;//與對應的標誌位相與
    if(abc == S_IFDIR)          //結果與標誌位比較
        printf("It's a directory.\n");
    return 0;
}
執行結果:

It's a directory.


其實還有一個簡單的方法,檔案型別在POSIX中定義了檢查這些型別的巨集定義:

S_ISLINGK(st_mode)      判斷是否位符號連結
S_ISREG(st_mode)        是否為一般檔案
S_ISDIR(st_mode)        是否為目錄
S_ISCHR(st_mode)        是否位字元裝置檔案
S_ISBLK(s3e)            是否先進先出
S_ISSOCK(st_mode)       是否為socket
可以根據這些函式的返回值判斷,如果是,則返回1。(我試了一下,好像是這樣的)