2011-12-30 90 views
0

我在Objective C程序中創建了以下代碼以獲取目錄中文件的大小,我必須在C中執行此操作,而不使用任何Objective-C方法。這可以正常工作,並在使用小尺寸文件檢查時提供正確的大小。但是當涉及到大文件(使用7GB文件進行測試)時,這個大小的變量將文件的大小返回爲0.任何人都可以幫助我解決這個問題嗎?以C返回大小獲取大文件的大小爲0

//filePath is a string parameter which takes the path of the file 
    FILE *fp=nil; 
    const char *filePathInToChar = [filePath UTF8String]; 
    fp = fopen(filePathInToChar, "rb"); 
    fseek(fp, 0, SEEK_END); 
    long size = ftell(fp); 

回答

2

你的問題是,ftell返回的文件流中的當前位置爲long int,在32位系統上通常具有最大值2^31或2GB換句話說。

您可以使用stat(所以你實際上並不需要打開和關閉文件):

#include <sys/stat.h> 

struct stat buf; 
stat(filePathInToChar, &buf); 
off_t size = buf.st_size; 

off_t應該long long通常是64位。

+0

thnx這做了魔術 – user1120633 2011-12-30 05:10:05

1

使用ftello()。它返回一個off_t,它在達爾文下解析爲long long

+0

感謝您的幫助。我用它作爲, 'off_t size = ftello(fp);' 仍然值爲零號。這是我使用的代碼是正確的嗎? – user1120633 2011-12-30 04:24:29

+0

檢查「fp」不是NULL。 (並且不要使用'nil';這是針對Objective-C類型的。) – 2011-12-30 04:25:52

+0

fp不爲null。這已被證實。 – user1120633 2011-12-30 04:53:19

0

7GB - > 7516192768字節

如果long你的平臺上只有32位,它能夠保持最大值爲2^31(因爲它的簽署) - > 2147483648 - > 2GB。即使您將其設置爲未簽名,您也只能表示高達4GB。你需要使用更大的類型。編譯器可能支持long long。試試吧,它的64位和大到足以保持這個價值。您也可以嘗試int64_t<stdint.h>並查看是否支持。

0

您是否在fopen()調用後檢查fp是否爲NULL

if (fp) { 
    /* fseek() to SEEK_END and then ftell() to get position */ 
} 
else { 
    fprintf(stderr, "Something went wrong!\n"); 
} 

請注意,nil不是NULL。 C指針使用NULL

0

使用seek不會告訴你文件的大小。它最多可以告訴你文件中的字符數量,但更有可能它會返回一些信息,這使得實現很容易尋找。如果你想知道文件的大小,你需要使用類似stat()或封裝的某些版本來使它更容易使用,例如來自Boost的文件系統庫。