代码之家  ›  专栏  ›  技术社区  ›  KPexEA

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

  •  7
  • KPexEA  · 技术社区  · 16 年前

    当前代码会这样做,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;
    
    6 回复  |  直到 16 年前
        1
  •  5
  •   davenpcj    16 年前

    如果你在窗户里,你想 GetFileSizeEx (MSDN) . 返回值是64位int。

    Linux上 stat64 (manpage) 是正确的。fstat如果您正在处理文件*。

        2
  •  9
  •   R.. GitHub STOP HELPING ICE    14 年前

    忽略所有出现“64”的答案。在Linux上,您应该添加 -D_FILE_OFFSET_BITS=64 到你的标志和使用 fseeko ftello 接收/返回的函数 off_t 值而不是 long .这些不是C的一部分,而是POSIX。其他(非Linux)POSIX系统可能需要不同的选项来确保 奥夫特 是64位的;请检查文档。

        3
  •  2
  •   Adam Pierce    16 年前

    在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;
    }
    
        4
  •  1
  •   Andrew Edgecombe    16 年前

    (从glibc手册中被盗)

    int fgetpos64 (FILE *stream, fpos64_t *position)

    此函数与fgetpos类似,但文件位置以类型为的变量返回 fpos64_t 指向哪个位置。

    如果源是用 _FILE_OFFSET_BITS == 64 在32位机器上,此功能在名称下可用 fgetpos 因此可以透明地替换旧接口。

        5
  •  1
  •   Martin Beckett    16 年前

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

        6
  •  0
  •   Captain Segfault    16 年前

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