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调用。