繁体   English   中英

确定大于4GB的文件的大小

[英]Determining the size of a file larger than 4GB

代码目前正在执行此操作,fgetpos会处理大于4GB的文件,但搜索会返回错误,所以任何想法如何寻找file > 4GB结尾file > 4GB

fpos_t currentpos;

sok=fseek(fp,0,SEEK_END);
assert(sok==0,"Seek error!");

fgetpos(fp,&currentpos);
m_filesize=currentpos;

忽略出现在其中的“64”的所有答案。 在Linux上,您应该将-D_FILE_OFFSET_BITS=64添加到CFLAGS并使用fseekoftello函数,这些函数接受/返回off_t值而不是long 这些不是C的一部分,而是POSIX。 其他(非Linux)POSIX系统可能需要不同的选项以确保off_t为64位; 检查你的文档。

如果您在Windows中,则需要GetFileSizeEx(MSDN) 返回值是64位int。

在linux stat64(手册页)是正确的。 如果您正在处理文件*,请使用fstat。

这段代码适用于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;
}

(从glibc手册中窃取)

int fgetpos64 (FILE *stream, fpos64_t *position)

此函数类似于fgetpos,但文件位置在fpos64_t类型的变量中fpos64_t到哪个位置。

如果在32位机器上使用_FILE_OFFSET_BITS == 64编译源代码,则此函数在名称fgetpos下可用,因此透明地替换旧接口。

Stat始终比fseek更好地确定文件大小,它将在非文件的情况下安全地失败。 64位文件大小是一个特定于操作的东西,在gcc上你可以在命令的末尾添加“64”,或者你可以强制它在默认情况下进行所有标准调用64。 有关详细信息,请参阅编译器手

至少在Linux上,您可以使用lseek64而不是fseek。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM