C: stat 没有正确显示大文件的文件大小
C: stat does not show filesize properly for large files
我有一个打印文件大小和文件名的简单函数:
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
的 return 代码并打印它时,它是 0
:
ret = lstat(filename,&fileStat)
我正在 64 位系统上编译和运行我的代码。
很明显,fileStat.st_size
溢出了,但是为什么?
lstat
给了你正确的答案。 printf
就是问题所在。在实践中使用 %'ld
而不是 %'d
就足够了,或者如果你想迂腐地正确,那么这样做:
printf(" %'jd", (intmax_t)fileStat.st_size);
如果出现 intmax_t
不存在的错误,您可能还需要 #include <stdint.h>
。
我有一个打印文件大小和文件名的简单函数:
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
的 return 代码并打印它时,它是 0
:
ret = lstat(filename,&fileStat)
我正在 64 位系统上编译和运行我的代码。
很明显,fileStat.st_size
溢出了,但是为什么?
lstat
给了你正确的答案。 printf
就是问题所在。在实践中使用 %'ld
而不是 %'d
就足够了,或者如果你想迂腐地正确,那么这样做:
printf(" %'jd", (intmax_t)fileStat.st_size);
如果出现 intmax_t
不存在的错误,您可能还需要 #include <stdint.h>
。