【发布时间】:2020-08-10 14:12:16
【问题描述】:
我有一个简单的函数来打印文件大小和文件名:
void *mystat(void *filename) {
struct stat fileStat;
if (lstat(filename,&fileStat) < 0) {
fprintf(stderr, "no such file or directory: %s\n", filename);
return NULL;
}
printf(" %'d",fileStat.st_size);
printf(" %s\n", filename);
}
它适用于小文件,但当文件很大(几 GB)时,它会打印大小 0。
为什么这不适用于大文件?
编辑
实际上,当文件大小是4GB 的倍数时,它只打印文件大小0。在其他情况下,当文件很大但不是多个时,它会打印负数。
但是,当我捕获lstat 的返回码并打印出来时,它是0:
ret = lstat(filename,&fileStat)
我正在 64 位系统上编译和运行我的代码。
很明显,fileStat.st_size 溢出了,但是为什么?
【问题讨论】:
-
对于这个问题,我们可能需要知道您使用的是哪个系统。比如
off_t是一个32位的int类型,它只能表示op大小到4GB左右。 -
当
lstat失败时检查errno的值。很可能是EOVERFLOW。 stat man page 告诉您原因(以及如何克服它):“例如,当在没有 -D_FILE_OFFSET_BITS=64 的 32 位平台上编译的应用程序在其文件上调用 stat() 时,可能会发生此错误大小超过 (1 -
请看我的编辑