11

我做了一个简单的函数,它得到一个文件的大小。

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”来打印它。

4

5 回答 5

5

您可以使用 Win32GetFileSizeEx功能。

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;
于 2010-03-02T07:01:23.800 回答
5

您可能可以使用_stat64

于 2010-03-02T07:06:02.640 回答
2

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
于 2010-03-02T07:08:18.270 回答
2

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

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

溢出

(stat()) 路径是指一个文件,其大小不能用 off_t 类型表示。当在没有 -D_FILE_OFFSET_BITS=64 的 32 位平台上编译的应用程序在大小超过 (2<<31)-1 位的文件上调用 stat() 时,可能会发生这种情况。

于 2010-03-02T07:19:50.243 回答
0

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

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

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

于 2010-03-02T07:04:59.713 回答