我在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);
答案 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的文件系统库。