Linux 下C語(yǔ)言獲取文件大小
Linux 下C語(yǔ)言獲取文件大小
C語(yǔ)言是一種比較底層的語(yǔ)言,有時(shí)在其他語(yǔ)言中很容易操作的事情,在c語(yǔ)言中就比較麻煩,例如獲取一個(gè)文件的大小。Java中File類(lèi)有個(gè)length函數(shù),Python中os.path包中有個(gè)getsize函數(shù),C語(yǔ)言中卻沒(méi)有直接對(duì)應(yīng)的函數(shù)獲取文件大小。
目前,網(wǎng)上有一種流傳很廣的方法,讀取文件到內(nèi)存,然后跳轉(zhuǎn)到文件末尾,查看跳轉(zhuǎn)的長(zhǎng)度。代碼如下:
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移動(dòng)一個(gè)文件的存取位置到文件的末尾,然后利用ftell獲得目前的文件訪問(wèn)位置。這種方法可以認(rèn)為是一種間接的獲取方式。雖說(shuō)可以獲得文件大小,但是有兩個(gè)缺點(diǎn)。首先,ftell的返回值為long,在不同環(huán)境下占用的字節(jié)數(shù)也不同,這就可能存在long是四個(gè)字節(jié)的情況。此時(shí),獲取的文件大小就不能超過(guò)2G,否則就會(huì)出錯(cuò)。
但是,上述缺點(diǎn)在大多數(shù)情況下都沒(méi)問(wèn)題,超大文件還可以通過(guò)fsetpos和fgetpos獲取文件大小。最致命的缺陷就是它需要加載文件到內(nèi)存,然后跳轉(zhuǎn)到文件末尾,這個(gè)操作非常耗時(shí)!可能在讀取少量文件時(shí)體現(xiàn)不出,但是當(dāng)文件達(dá)到上萬(wàn)個(gè)時(shí),速度就會(huì)慢的要命,這種方法相當(dāng)于把所有的文件都讀到內(nèi)存中一遍!
如果可能,盡量避免采用上述間接的方式獲取文件大小。在Linux下,還有一種更簡(jiǎn)單的方式,通過(guò)讀取文件信息獲得文件大小,速度也快很多。代碼如下:
#include <sys/stat.h>
int file_size2(char* filename)
{
struct stat statbuf;
stat(filename,&statbuf);
int size=statbuf.st_size;
return size;
}
這種方式首先獲得相關(guān)文件的狀態(tài)信息,然后從狀態(tài)信息中讀取大小信息。由于沒(méi)有讀取文件的操作,所以操作速度非常快。強(qiáng)烈建議大家在linux下使用這種方式。Windows平臺(tái)下肯定也有類(lèi)似的函數(shù)讀取文件信息,不過(guò)本人常年不在windows下編程,所以在此不做介紹。
相關(guān)文章
shell結(jié)合expect寫(xiě)的批量scp腳本工具
expect用于自動(dòng)化地執(zhí)行l(wèi)inux環(huán)境下的命令行交互任務(wù),例如scp、ssh之類(lèi)需要用戶(hù)手動(dòng)輸入密碼然后確認(rèn)的任務(wù)。有了這個(gè)工具,定義在scp過(guò)程中可能遇到的情況,然后編寫(xiě)相應(yīng)的處理語(yǔ)句,就可以自動(dòng)地完成scp操作了2013-02-02
Linux動(dòng)態(tài)庫(kù)函數(shù)的詳解
這篇文章主要介紹了Linux動(dòng)態(tài)庫(kù)函數(shù)的詳解的相關(guān)資料,希望通過(guò)本文能幫助到大家,讓大家理解掌握這部分的內(nèi)容,需要的朋友可以參考下2017-10-10
Linux系統(tǒng)診斷之內(nèi)存基礎(chǔ)深入詳解
這篇文章主要介紹了Linux系統(tǒng)診斷之內(nèi)存基礎(chǔ)深入詳解,雖然是基礎(chǔ)但是列舉的很詳細(xì),有感興趣的同學(xué)可以研究下2021-03-03
Linux下實(shí)現(xiàn)SNMP一鍵安裝的Shell腳本
這篇文章主要介紹了Linux下實(shí)現(xiàn)SNMP一鍵安裝的Shell腳本,非常實(shí)用,需要的朋友可以參考下2014-07-07

