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 sat 的定義如下:

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")
S_IFLNK         0120000     符號連結(symbolic link)                   ("l")
S_IFREG         0100000     一般檔案                                  ("-")
S_IFBLK         0060000     區塊裝置(block device)                    ("b")           
S_IFDIR         0040000     目錄                                      ("d")
S_IFCHR         0020000     字元裝置(character device)                ("c")
S_IFIFO         0010000     先進先出(fifo)                            ("p")
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;  
}

其實還有一個簡單的方法,檔案型別在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