确定文件大小大于4GB

时间:2020-03-06 14:31:16  来源:igfitidea点击:

目前,代码可以执行此操作,而fgetpos可以处理大于4GB的文件,但是seek返回错误,那么如何找到" file> 4GB"末尾的任何想法?

fpos_t currentpos;

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

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

解决方案

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

(从glibc手册中窃取)

int fgetpos64(FILE * stream,fpos64_t * position)

该函数与fgetpos相似,但是文件位置以fpos64_t类型的变量返回,该变量指向该位置。

如果源代码是在32位计算机上使用_FILE_OFFSET_BITS == 64进行编译的,则此功能在名称" fgetpos"下可用,因此可以透明地替换旧接口。

Stat总是比fseek更好,可以确定文件的大小,如果不是文件,它肯定会失败。
64位文件大小是特定于操作的内容,在gcc上,我们可以在命令末尾添加" 64",也可以强制其默认情况下进行所有标准调用64. 有关详细信息,请参见编译器手册。

这段代码在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;
}

如果我们使用Windows,则需要GetFileSizeEx(MSDN)。返回值是一个64位的int。

在linux上stat64(联机帮助页)是正确的。如果使用的是FILE *,则为fstat。

忽略所有答案,其中出现" 64"。在Linux上,我们应该在CFLAGS中添加-D_FILE_OFFSET_BITS = 64,并使用fseeko和ftello函数,这些函数采用/返回off_t值而不是long值。这些不是C的一部分,而是POSIX。其他(非Linux)POSIX系统可能需要不同的选项,以确保`off_t'是64位。检查文档。