C語言獲取檔案大小
阿新 • • 發佈:2019-02-03
C語言是一種比較底層的語言,有時在其他語言中很容易操作的事情,在C語言中就比較麻煩,例如獲取一個檔案的大小。Java中File類有個length函式,Python中os.path包中有個getsize函式,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下程式設計,所以在此不做介紹。