linux stat 函數詳解

S_ISREG等幾個常見的宏

stat函數講解:

表頭文件: #include <sys/stat.h>
#include <unistd.h>
定義函數: int stat(const char *file_name, struct stat *buf);
函數說明: 通過文件名filename獲取文件信息,並保存在buf所指的結構體stat中
返回值: 執行成功則返回0,失敗返回-1,錯誤代碼存於errno
錯誤代碼:
ENOENT 參數file_name指定的文件不存在
ENOTDIR 路徑中的目錄存在但卻非真正的目錄
ELOOP 欲打開的文件有過多符號連接問題,上限爲16符號連接
EFAULT 參數buf爲無效指針,指向無法存在的內存空間
EACCESS 存取文件時被拒絕
ENOMEM 核心內存不足
ENAMETOOLONG 參數file_name的路徑名稱太長


int stat(const char *file_name,struct stat *buf);
int fstat(int filedes,struct stat *buf);
stat 結構定義於:/usr/include/sys/stat.h 文件中
  struct stat finfo;
  stat( sFileName, &finfo );
  int size = finfo. st_size;
  struct stat {
  mode_t st_mode; //文件對應的模式,文件,目錄等
  ino_t st_ino; //i-node節點號
  dev_t st_dev; //設備號碼
  dev_t st_rdev; //特殊設備號碼
  nlink_t st_nlink; //文件的連接數
  uid_t st_uid; //文件所有者
  gid_t st_gid; //文件所有者對應的組
  off_t st_size; //普通文件,對應的文件字節數
  time_t st_atime; //文件最後被訪問的時間
  time_t st_mtime; //文件內容最後被修改的時間
  time_t st_ctime; //文件狀態(屬性)改變時間
  blksize_t st_blksize; //文件內容對應的塊大小
  blkcnt_t st_blocks; //文件內容對應的塊數量
  };

stat用來判斷沒有打開的文件,而fstat用來判斷打開的文件.我們使用最多的屬性是st_mode.通過着屬性我們可以判斷給定的文件是一個普通文件還是一個目錄,連接等等.可以使用下面幾個宏來判斷.
S_ISLNK(st_mode):是否是一個連接.

S_ISREG是否是一個常規文件.

S_ISDIR是否是一個目錄

S_ISCHR是否是一個字符設備.

S_ISBLK是否是一個塊設備

S_ISFIFO是否是一個FIFO文件.

S_ISSOCK是否是一個SOCKET文件.



用法:

//定義一個結構體
struct stat m;

//用戶輸入的文件名(用來判斷是否是目錄)。
char *filename;

int a;
int n = stat(filename,&m);
a = S_ISDIR(m.st_mode);

如果a爲真,則說明是目錄,否則不是。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章