获取C中的大文件大小

Cya*_*yan 9 c file filesize large-files

在有人抱怨"重复"之前,我一直在彻底检查SO,但似乎还没有干净的答案,尽管问题看起来很简单.

我正在寻找一个可移植的C代码,它能够提供文件的大小,即使这样的文件大于4GB.

通常的方法(fseek,ftell)工作正常,只要文件仍然<2GB.它在各处得到了相当好的支持,所以我试图找到相同的东西.

不幸的是,所有编译器都不支持更新的方法(fseeko,ftello).例如,MinGW错过了(显然是MSVC).此外,一些评论让我相信新的返回类型(off_t)不一定支持> 2GB的大小,它可能依赖于一些外部参数来进行检查.

MSVC不支持明确的方法(fseeko64,ftello64).MS提供等效的_fseeki64和_ftelli64.这已经很糟糕,但它变得更糟:一些Linux配置似乎在运行时严重支持这些功能.例如,我在PowerPC上的Debian Squeeze,使用GCC 4.4,将使用fseeko64生成一个"filesize"方法,它始终返回0(虽然它适用于Ubuntu64).MinGW似乎回答了2GB以上的随机垃圾.

嗯,就可移植性而言,我有点无能为力.如果我需要制作一堆#if #else,那么为什么不首先直接使用OS和编译器细节方法,例如用于MSVC的GetFileSize().

Mat*_*lia 8

你这么说:没有便携方法; 如果我是你,我会选择GetFileSizeWindows和statPOSIX.

  • 您可以在Windows上使用`_stat64`来保持代码*sorta*相同. (2认同)

Frx*_*rem 7

您应该能够stat64在Linux_stat64Windows上使用以获取超过2 GB的文件的文件大小信息,并且这两个函数的使用非常相似.您也可以在Windows上使用几个#defines stat64:

#if __WIN32__
#define stat64 _stat64
#endif
Run Code Online (Sandbox Code Playgroud)

但是,尽管这应该有效,但应该注意的是_stat,Windows上的函数系列实际上只是其他函数的包装,并且会增加额外的资源和时间开销.


pmg*_*pmg 5

int ch;
FILE *f = fopen("file_to_analyse", "rb");
/* error checking ommited for brevity */
unsigned long long filesize = 0; /* or unsigned long for C89 compatability*/
while ((ch = fgetc(f)) != EOF) filesize++;
fclose(f);
/* error checking ommited for brevity */
Run Code Online (Sandbox Code Playgroud)

  • 好吧,这是唯一符合标准的方式,但我希望你是讽刺的:读取整个文件,可能是2 GB以上,一个字符,只是为了知道它的大小(在当前文件系统上只是文件的一个属性)很愚蠢...... (2认同)
  • 噢,不,不,不...请告诉我你在开玩笑.另一方面,问题是关于便携式方式,而不是有效方式.这确实是一种便携式方式. (2认同)
  • 它是事件驱动的,这就是它如此之快的原因. (2认同)
  • @Gerard因为文件系统在写入*时计算字节*,然后将值存储起来.这就是它如何知道EOF是什么.完整地读取大量文件以确定大小很慢,读取存储在文件系统中的预先计算的字段很快. (2认同)