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

8

目前的代码可以执行此操作,而且fgetpos可以处理大于4GB的文件,但是seek会返回一个错误,那么有什么办法可以寻找到大于4GB的文件结尾呢?

fpos_t currentpos;

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

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

只是出于好奇,如果您还没有到达文件的末尾,您确定fgetpos是否正常工作? - Brian R. Bondy
fpos_t不是整型,因此最后一行无效。 - R.. GitHub STOP HELPING ICE
6个回答

9
忽略所有出现“64”的答案。在Linux中,您应该将-D_FILE_OFFSET_BITS=64添加到您的CFLAGS中,并使用fseekoftello函数,这些函数采用/返回off_t值而不是long。这些函数不属于C语言标准,但属于POSIX标准。其他(非Linux)的POSIX系统可能需要不同的选项来确保off_t为64位,请查看您的文档。

你能提供参考资料吗? - qed
2
@qed:“不属于POSIX”:请参阅http://pubs.opengroup.org/onlinepubs/9699919799/functions/contents.html;使用`-D_FILE_OFFSET_BITS = 64`:请参阅http://man7.org/linux/man-pages/man7/feature_test_macros.7.html。 - R.. GitHub STOP HELPING ICE

6
如果您使用的是Windows系统,您需要使用GetFileSizeEx (MSDN)。返回值是一个64位整数。
如果您使用的是Linux系统,则正确的方法是使用stat64 (manpage)。如果您正在使用FILE*,则应使用fstat。

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;
}

2

(摘自glibc手册)

int fgetpos64 (FILE *stream, fpos64_t *position)

此函数类似于fgetpos,但文件位置返回到类型为fpos64_t的变量中,该变量由position指向。

如果源代码在32位机器上使用_FILE_OFFSET_BITS == 64编译,则此函数可用于名称fgetpos,并且自动替换旧接口。


2

使用stat函数来确定文件大小比使用fseek更好,它可以在不是文件的情况下安全地失败。 64位文件大小是操作系统特定的事情,在gcc上,您可以在命令的末尾加上“64”,或者您可以强制使所有标准调用默认为64。有关详细信息,请参阅您的编译器手册。


1

在Linux上,你可以使用lseek64而不是fseek。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接