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>