代码目前正在执行此操作,fgetpos会处理大于4GB的文件,但搜索会返回错误,因此任何想法如何寻找到file > 4GB
的结尾?
fpos_t currentpos;
sok=fseek(fp,0,SEEK_END);
assert(sok==0,"Seek error!");
fgetpos(fp,¤tpos);
m_filesize=currentpos;
答案 0 :(得分:9)
忽略出现在其中的“64”的所有答案。在Linux上,您应该将-D_FILE_OFFSET_BITS=64
添加到您的CFLAGS并使用fseeko
和ftello
函数,这些函数接受/返回off_t
值而不是long
。这些不是C的一部分,而是POSIX。其他(非Linux)POSIX系统可能需要不同的选项以确保off_t
为64位;检查你的文件。
答案 1 :(得分:6)
如果您在Windows中,则需要GetFileSizeEx (MSDN)。返回值是64位int。
在Linux上stat64 (manpage)是正确的。 fstat如果你正在处理文件*。
答案 2 :(得分:3)
此代码适用于Linux:
int64_t bigFileSize(const char *path)
{
struct stat64 S;
if(-1 == stat64(path, &S))
{
printf("Error!\r\n");
return -1;
}
return S.st_size;
}
答案 3 :(得分:2)
(从glibc手册中窃取)
int fgetpos64 (FILE *stream, fpos64_t *position)
此函数类似于fgetpos,但文件位置在fpos64_t
类型的变量中返回,其位置指向。
如果在32位机器上使用_FILE_OFFSET_BITS == 64
编译源代码,则此功能在名称fgetpos
下可用,因此透明地替换旧接口。
答案 4 :(得分:2)
Stat总是优于fseek来确定文件大小,它会在非文件的情况下安全地失败。 64位文件大小是一个特定于操作的东西,在gcc上你可以在命令的末尾添加“64”,或者你可以强制它在默认情况下进行所有标准调用64。有关详细信息,请参阅编译器手册。
答案 5 :(得分:1)
至少在linux上,你可以使用lseek64而不是fseek。