1. 程式人生 > >linux下C獲取檔案的大小

linux下C獲取檔案的大小

stat(取得檔案狀態)    
相關函式     fstat,lstat,chmod,chown,readlink,utime
 
表頭檔案     #include <sys/stat.h>
#include <unistd.h>
 
定義函式     int   stat(const   char   *   file_name,struct   stat   *buf);
 
函式說明     stat()用來將引數file_name所指的檔案狀態,複製到引數buf所指的結構中。
下面是struct   stat內各引數的說明
struct   stat
{
dev_t   st_dev;   /*device*/
ino_t   st_ino;   /*inode*/
mode_t   st_mode;   /*protection*/
nlink_t   st_nlink;   /*number   of   hard   links   */
uid_t   st_uid;   /*user   ID   of   owner*/
gid_t   st_gid;   /*group   ID   of   owner*/
dev_t   st_rdev;   /*device   type   */
off_t   st_size;   /*total   size,   in   bytes*/
unsigned   long   st_blksize;   /*blocksize   for   filesystem   I/O   */
unsigned   long   st_blocks;   /*number   of   blocks   allocated*/
time_t   st_atime;   /*   time   of   lastaccess*/
time_t   st_mtime;   /*   time   of   last   modification   */
time_t   st_ctime;   /*   time   of   last   change   */
};
st_dev   檔案的裝置編號
st_ino   檔案的i-node
st_mode   檔案的型別和存取的許可權
st_nlink   連到該檔案的硬連線數目,剛建立的檔案值為1。
st_uid   檔案所有者的使用者識別碼
st_gid   檔案所有者的組識別碼
st_rdev   若此檔案為裝置裝置檔案,則為其裝置編號
st_size   檔案大小,以位元組計算
st_blksize   檔案系統的I/O   緩衝區大小。
st_blcoks   佔用檔案區塊的個數,每一區塊大小為512   個位元組。
st_atime   檔案最近一次被存取或被執行的時間,一般只有在用mknod、utime、read、write與tructate時改變。
st_mtime   檔案最後一次被修改的時間,一般只有在用mknod、utime和write時才會改變
st_ctime   i-node最近一次被更改的時間,此引數會在檔案所有者、組、許可權被更改時更新先前所描述的st_mode   則定義了下列數種情況
S_IFMT   0170000   檔案型別的位遮罩
S_IFSOCK   0140000   scoket
S_IFLNK   0120000   符號連線
S_IFREG   0100000   一般檔案
S_IFBLK   0060000   區塊裝置
S_IFDIR   0040000   目錄
S_IFCHR   0020000   字元裝置
S_IFIFO   0010000   先進先出
S_ISUID   04000   檔案的(set   user-id   on   execution)位
S_ISGID   02000   檔案的(set   group-id   on   execution)位
S_ISVTX   01000   檔案的sticky位
S_IRUSR(S_IREAD)   00400   檔案所有者具可讀取許可權
S_IWUSR(S_IWRITE)00200   檔案所有者具可寫入許可權
S_IXUSR(S_IEXEC)   00100   檔案所有者具可執行許可權
S_IRGRP   00040   使用者組具可讀取許可權
S_IWGRP   00020   使用者組具可寫入許可權
S_IXGRP   00010   使用者組具可執行許可權
S_IROTH   00004   其他使用者具可讀取許可權
S_IWOTH   00002   其他使用者具可寫入許可權
S_IXOTH   00001   其他使用者具可執行許可權
上述的檔案型別在POSIX   中定義了檢查這些型別的巨集定義
S_ISLNK   (st_mode)   判斷是否為符號連線
S_ISREG   (st_mode)   是否為一般檔案
S_ISDIR   (st_mode)是否為目錄
S_ISCHR   (st_mode)是否為字元裝置檔案
S_ISBLK   (s3e)   是否為先進先出
S_ISSOCK   (st_mode)   是否為socket
若一目錄具有sticky   位(S_ISVTX),則表示在此目錄下的檔案只能被該檔案所有者、此目錄所有者或root來刪除或改名。
 
返回值     執行成功則返回0,失敗返回-1,錯誤程式碼存於errno
 
錯誤程式碼     ENOENT   引數file_name指定的檔案不存在
ENOTDIR   路徑中的目錄存在但卻非真正的目錄
ELOOP   欲開啟的檔案有過多符號連線問題,上限為16符號連線
EFAULT   引數buf為無效指標,指向無法存在的記憶體空間
EACCESS   存取檔案時被拒絕
ENOMEM   核心記憶體不足
ENAMETOOLONG   引數file_name的路徑名稱太長
 
範例     #include <sys/stat.h>
#include <unistd.h>
mian()
{
struct   stat   buf;
stat   (“/etc/passwd”,&buf);
printf(“/etc/passwd   file   size   =   %d   /n”,buf.st_size);
}
 
執行     /etc/passwd   file   size   =   705