C 如何获取文件';s大于4 Gb的大小?

C 如何获取文件';s大于4 Gb的大小?,c,windows,filesize,C,Windows,Filesize,我做了一个简单的函数,它是一个文件的大小 int file_size( char * filename ) { int size; struct stat st; stat( filename, &st ); size = st.st_size; return size; }//file_size 它工作正常,但是如果我有一个大于4Gb的文件,我会得到一个负数,当然这不是正确的文件大小。那么我怎么才能得到这么大的文件大小呢?我认为

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

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”将其打印出来。

您可以使用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;

我认为,问题是因为文件大小大于INT_MAX,所以它给了您 负值

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

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


您可能可以使用。

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

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

my(64位x86机器)上的
stat
手册页显示:

溢流

(stat())路径指的是 无法在类型中表示大小 关了。这可能发生在 在32位上编译的应用程序 无站台
-D_FILE_OFFSET_BITS=64对大小超过(2)的文件调用stat()。如果将
int
更改为
off\u t
,或者如果不可用,
size\u t
,则在返回类型和
size
声明中都调用stat()。没有理由不能预先添加“unsigned”因为文件大小不太可能为负。如果截断发生在st.st_大小,我很好奇在这种情况下如何将其分配给long。非常感谢,这是解决我问题的最简单方法。唯一的警告可能是(不太确定)在同一进程中混合和匹配posix调用与win32调用可能会很困难。看起来OP可能来自unix后台,只想使用posix调用。