在C語言中測試文件的大小,主要使用二個標准函數。
1.fseek
函數原型:int fseek ( FILE * stream, long int offset, int origin );
參數說明:stream,文件流指針;offest,偏移量;orgin,原(始位置。其中orgin的可選值有SEEK_SET(文件開始)、SEEK_CUR(文件指針當前位置)、SEEK_END(文件結尾)。
函數說明:對於二進制模式打開的流,新的流位置是origin + offset。
2.ftell
函數原型:long int ftell ( FILE * stream );
函數說明:返回流的位置。對於二進制流返回值為距離文件開始位置的字節數。
獲取文件大小C程序:
- int file_size(char* filename)
- {
- FILE *fp=fopen(filename,"r");
- if(!fp) return -1;
- fseek(fp,0L,SEEK_END);
- int size=ftell(fp);
- fclose(fp);
- return size;
- }
上述方法利用fseek移動一個文件的存取位置到文件的末尾,然后利用ftell獲得目前的文件訪問位置。這種方法可以認為是一種間接的獲取方式。雖說可以獲得文件大小,但是有兩個缺點。首先,ftell的返回值為long,在不同環境下占用的字節數也不同,這就可能存在long是四個字節的情況。此時,獲取的文件大小就不能超過2G,否則就會出錯。
但是,上述缺點在大多數情況下都沒問題,超大文件還可以通過fsetpos和fgetpos獲取文件大小。最致命的缺陷就是它需要加載文件到內存,然后跳轉到文件末尾,這個操作非常耗時!可能在讀取少量文件時體現不出,但是當文件達到上萬個時,速度就會慢的要命,這種方法相當於把所有的文件都讀到內存中一遍!
如果可能,盡量避免采用上述間接的方式獲取文件大小。在linux下,還有一種更簡單的方式,通過讀取文件信息獲得文件大小,速度也快很多。
- #include <sys/stat.h>
- int file_size2(char* filename)
- {
- struct stat statbuf;
- stat(filename,&statbuf);
- int size=statbuf.st_size;
- return size;
- }
這種方式首先獲得相關文件的狀態信息,然后從狀態信息中讀取大小信息。由於沒有讀取文件的操作,所以操作速度非常快。強烈建議大家在linux下使用這種方式。Windows平台下肯定也有類似的函數讀取文件信息,不過本人常年不在windows下編程,所以在此不做介紹。
另外,可以利用statfs函數查看磁盤空間:
#include <sys/statfs.h> #include <stdio.h> int main() { struct statfs diskInfo; statfs("/home/carl/", &diskInfo); unsigned long long blocksize = diskInfo.f_bsize; //每個block里包含的字節數 unsigned long long totalsize = blocksize * diskInfo.f_blocks; //總的字節數,f_blocks為block的數目 printf("Total_size = %llu B = %llu KB = %llu MB = %llu GB\n", totalsize, totalsize>>10, totalsize>>20, totalsize>>30); unsigned long long freeDisk = diskInfo.f_bfree * blocksize; //剩余空間的大小 unsigned long long availableDisk = diskInfo.f_bavail * blocksize; //可用空間大小 printf("Disk_free = %llu MB = %llu GB\nDisk_available = %llu MB = %llu GB\n", freeDisk>>20, freeDisk>>30, availableDisk>>20, availableDisk>>30); return 0; }