c語言可以通過stat()函數獲得文件屬性,通過返回的文件屬性,從中獲取文件大小。
創(chuàng)新互聯服務項目包括朗縣網站建設、朗縣網站制作、朗縣網頁制作以及朗縣網絡營銷策劃等。多年來,我們專注于互聯網行業(yè),利用自身積累的技術優(yōu)勢、行業(yè)經驗、深度合作伙伴關系等,向廣大中小型企業(yè)、政府機構等提供互聯網行業(yè)的解決方案,朗縣網站推廣取得了明顯的社會效益與經濟效益。目前,我們服務的客戶以成都為中心已經輻射到朗縣省份的部分城市,未來相信會繼續(xù)擴大服務區(qū)域并繼續(xù)獲得客戶的支持與信任!
#include sys/stat.h ?可見以下結構體和函數
struct stat {
? _dev_t st_dev;
? _ino_t st_ino;
? unsigned short st_mode;
? short st_nlink;
? short st_uid;
? short st_gid;
? _dev_t st_rdev;
? _off_t st_size; ? //文件大小
? time_t st_atime;
? time_t st_mtime;
? time_t st_ctime;
? };
stat(const char *, struct _stat *); ?//根據文件名得到文件屬性
參考代碼:
#include?sys/stat.h
void?main(?)
{
struct?stat?buf?;
if?(?stat(?"test.txt",?buf?)??0?)
{
perror(?"stat"?);
return?;
}
printf("file?size:%d\n",?buf.st_size?);
}
方法一:利用純C語言來獲取文件大小
unsigned long get_file_size(const char *filename){
unsigned long size;
FILE* fp = fopen( filename, "rb" );
if(fp==NULL){
printf("ERROR: Open file %s failed.\n", filename);
return 0;
}
fseek( fp, 0L, SEEK_END );
size=ftell(fp);
fclose(fp);
return size;
}
注:
ftell函數返回文件指針當前位置相對應文件首的便宜字節(jié)數,參數為文件指針。
fseek函數用于移動文件指針,第一個參數是文件指針,第二個參數是偏移量(正數表示正向偏移,負數表示負向偏移),第三個參數設定文件從哪里偏移,有三個選擇:SEEK_SET(文件頭,其是常數0)、SEEK_CUR(文件當前位置,其是常數1)、SEEK_END(文件尾,其是常數2)。
優(yōu)缺點:好處是你只要會C語言,就能夠完全掌握而且十分容易理解這里面的道理。確定是純C語言目前只能讀取不超過2G的文件。所以對于超過2G的文件,其返回值是不正確的。
方法二:利用系統(tǒng)函數獲取
筆者使用Uinx/Linux,所以此處就只寫這類平臺上的文件大小獲許方式了。在Linux類平臺上,每個被系統(tǒng)所管理的文件都有一個文件屬性結構體(其中一個屬性就是文件大?。┡c其對應,這個結構體叫stat,其內容在 /sys/stat.h中:
stat {
mode_t st_mode; //文件對應的模式,文件,目錄等
ino_t st_ino; //inode節(jié)點號
dev_t st_dev; //設備號碼
dev_t st_rdev; //特殊設備號碼
nlink_t st_nlink; //文件的連接數
uid_t st_uid; //文件所有者
gid_t st_gid; //文件所有者對應的組
off_t st_size; //普通文件,對應的文件字節(jié)數
time_t st_atime; //文件最后被訪問的時間
time_t st_mtime; //文件內容最后被修改的時間
time_t st_ctime; //文件狀態(tài)改變時間
blksize_t st_blksize; //文件內容對應的塊大小
blkcnt_t st_blocks; //偉建內容對應的塊數量
}
文件的上述屬性,可以通過一個stat函數來獲取。
stat函數聲明形式:
stat(const char *restrict path, struct stat *restrict buf);
第一個參數是文件名,第二個參數是指向一個stat結構的指針。
由此我們很容易寫出如下函數:
unsigned long get_file_size(const char *filename){
struct stat buf;
if(stat(filename, buf)0){
return 0;
}
return (unsigned long)buf.st_size;
}
在進行大文件處理時,顯然需要采取后者。
注:與stat函數類似的函數還有l(wèi)stat函數、fstat 函數
你需要使用fseek函數將文件指針指向最后:
fseek(fp, 0L, SEEK_END);
sz = ftell(fp);
其中sz就是文件的大小。
當你知道文件的大小后,就可以通過fseek重新定義到文件開始的位置:
fseek(fp, 0L, SEEK_SET);
或使用下面的函數定義的文件開始:
rewind(fp);
可以到秒秒學上看看相關的內容,上面的課程講解得可以的。