获取C返回大小为0的大文件的大小

时间:2011-12-30 03:45:18

标签: c++ objective-c c

我在Objective C程序中创建了以下代码,以获取目录中文件的大小,我必须在不使用任何Objective-C方法的情况下在C中执行此操作。这工作正常,并在使用小尺寸文件检查时给出正确的大小。但是当谈到大文件(用7GB文件测试)时,这个大小变量会将文件的大小返回为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);

5 个答案:

答案 0 :(得分: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位。

答案 1 :(得分:1)

使用ftello()。它返回一个off_t,在Darwin下解析为long long

答案 2 :(得分:0)

7GB - &gt; 7516192768字节

如果您平台上的long仅为32位,则它能够容纳的最大值为2 ^ 31(因为它已签名) - &gt; 2147483648 - &gt; 2GB。即使你没有签名,你也只能代表4GB。您需要使用更大的类型。您的编译器可能支持long long。尝试一下,它是64位,足以保持这个价值。您也可以在int64_t中尝试<stdint.h>,看看是否支持。

答案 3 :(得分:0)

fp来电之后,您是否检查过NULL是否为fopen()

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

请注意,nil不是NULL。使用NULL作为C指针。

答案 4 :(得分:0)

使用搜索无论如何都不会告诉你文件的大小。它最好告诉你文件中的字符数,但更有可能它会返回一些信息,这使得实现很容易寻找。如果你想知道文件的大小,你需要使用stat()或封装的某些版本来使其更容易使用,例如:来自Boost的文件系统库。