【问题标题】:C: stat does not show filesize properly for large filesC: stat 不能正确显示大文件的文件大小
【发布时间】: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 的值。很可能是EOVERFLOWstat man page 告诉您原因(以及如何克服它):“例如,当在没有 -D_FILE_OFFSET_BITS=64 的 32 位平台上编译的应用程序在其文件上调用 stat() 时,可能会发生此错误大小超过 (1
  • 请看我的编辑

标签: c ls stat


【解决方案1】:

lstat 给你正确的答案。 printf 这就是问题所在。在实践中使用%'ld 而不是%'d 就足够了,或者如果你想学究气,那就这样做吧:

printf(" %'jd", (intmax_t)fileStat.st_size);

如果您收到intmax_t 不存在的错误消息,您可能还需要#include &lt;stdint.h&gt;

【讨论】:

  • 使用%'ld 有效。谢谢你。我将如何使用%'jd 并转换为intmax_t?您能否在答案中包含示例?
  • @400theCat 我刚刚添加了它。
  • 我怀疑 64 位文件长度会很好,直到 2070 年左右。届时intmax_t 可能会超过 64 位。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-12
  • 1970-01-01
  • 2013-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多