linux下C獲取文件的大小

獲取文件大小這裏有兩種方法:

方法一、

範例:

  

 

此種以打開文件的方法取得文件的大小,不適合大文件,並且可能會出現訪問衝突(比如正在下載的文件),效率也比較低

 

方法二、

 範例:

 

此種使用讀取文件屬性的方法得到文件的大小,效率較高,也較穩定

 

 

下面將stat的詳細信息粘貼出來:

 

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 

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