【问题标题】:How to get a file's size which is greater than 4 Gb?如何获得大于 4 Gb 的文件大小?
【发布时间】:2010-03-02 06:58:16
【问题描述】:

我做了一个简单的函数,获取文件的大小。

int file_size( char * filename )
{
     int size;
     struct stat st;

     stat( filename, &st );
     size = st.st_size;

     return size;

}//file_size

它工作正常,但如果我有一个大于 4Gb 的文件,我会得到一个负数,当然这不是正确的文件大小。那么我怎样才能得到这么大的文件大小呢?我认为,返回值应该是 int 之类的任何其他值,但我不知道是什么,而且我认为这不会解决我的问题。

谢谢,

坎皮

更新:

嗨!

我找到了解决方案。我必须使用__stat64。我修改了我的函数,现在它正在检索实际大小。我用一个 8Gb 的大文件对其进行了测试。

unsigned long long int file_size( char * filename )
{
    unsigned long long int size;
    struct __stat64 st;

    __stat64( filename, &st );
    size = st.st_size;

   return size;

}//file_size

还有一个通知:

当我使用 printf 时,我不得不使用 "%I64d" 来打印出来。

【问题讨论】:

  • 如果您将int 更改为off_t,或者如果不可用,size_t 会怎样?无论是返回类型还是size的声明。

标签: c windows filesize


【解决方案1】:

你或许可以使用_stat64

【讨论】:

  • 非常感谢,这是解决我问题的最简单方法。
【解决方案2】:

您可以使用 Win32 GetFileSizeEx 函数。

HANDLE aFile = CreateFile
(
  filename,
  FILE_READ_ATTRIBUTES,
  0,
  NULL,
  OPEN_EXISTING,
  FILE_ATTRIBUTE_NORMAL,
  NULL
);

if (aFile != INVALID_HANDLE_VALUE)
{
  long long aSize;
  GetFileSizeEx(aFile, &aSize);

  CloseHandle(aFile);
  return aSize;
}
else
  return -1;

【讨论】:

  • 唯一的警告可能是(不太确定)在同一进程中混合和匹配 posix 调用和 win32 调用可能很困难。看起来 OP 可能来自 unix 背景并且只想使用 posix 调用。
【解决方案3】:

st_size 在 wchar.h 中被定义为 long,因此您可以尝试使用 long,而不是 int

struct stat {
    ....
    _off_t     st_size;
    ....
}

....

typedef long _off_t;  

可能是这样的

long file_size( char * filename )
{
     long size;
     struct stat st;

     stat( filename, &st );
     size = st.st_size;

     return size;

}//file_size

【讨论】:

  • 没有理由不能在前面加上“无符号”,因为文件大小不太可能是负数。
  • 如果截断发生在 st.st_size 中,我很好奇在这种情况下将它分配给 long 有什么帮助。
【解决方案4】:

在这种情况下,stat() 的返回值可能为 -1,而errno 设置为EOVERFLOW

我(64 位 x86 机器)上 stat 的手册页说:

溢出

(stat()) 路径指的是一个文件,其 大小不能在类型中表示 off_t。当一个 在 32 位上编译的应用程序 无平台 -D_FILE_OFFSET_BITS=64 对大小超过 (2

【讨论】:

    【解决方案5】:

    我认为,问题是因为文件大小超过 INT_MAX ,所以它给了你 负值。

    也许您可以对 long 数据类型进行类型转换,它可能会起作用。

    否则使用 fseek 、 ftell 函数。然后从开始文件指针中减去结束文件指针。它还会为您提供文件大小。 (字节数)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-17
      • 1970-01-01
      • 2015-07-19
      • 1970-01-01
      • 2019-05-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多