以C / C ++获取文件大小的便携方式

时间:2010-03-11 10:26:35

标签: c++ c portability filesize platform-independent

我需要确定文件的字节大小。

编码语言是C ++,代码应该适用于Linux,Windows和任何其他操作系统。这意味着使用标准的C或C ++函数/类。

这种琐碎的需求显然不是一个简单的解决方案。

6 个答案:

答案 0 :(得分:7)

使用std的流你可以使用:

std::ifstream ifile(....);
ifile.seekg(0, std::ios_base::end);//seek to end
//now get current position as length of file
ifile.tellg();

如果你处理只写文件(std :: ofstream),那么方法就是另一种:

ofile.seekp(0, std::ios_base::end);
ofile.tellp();

答案 1 :(得分:6)

您可以使用统计系统调用:

#ifdef WIN32 
_stat64()
#else
stat64()

答案 2 :(得分:3)

如果你只需要文件大小,那肯定是矫枉过正的,但一般情况下,我会选择Boost.Filesystem进行与平台无关的文件操作。 其中包含的其他属性函数

template <class Path> uintmax_t file_size(const Path& p);

您可以找到参考here。尽管Boost Libraries看起来很庞大,但我发现它经常非常有效地实现。你也可以只提取你需要的功能,但这可能证明很难,因为Boost相当复杂。

答案 3 :(得分:0)

Simples:

std::ifstream ifs; 
ifs.open("mybigfile.txt", std::ios::bin); 
ifs.seekg(0, std::ios::end); 
std::fpos pos = ifs.tellg();

答案 4 :(得分:-1)

我们通常希望以最便携的方式完成工作,但在某些情况下,尤其是这样,我强烈建议您使用系统API以获得最佳性能。

答案 5 :(得分:-1)

可移植性要求您使用最小公分母,即C.(不是c ++) 我使用的方法如下。

#include <stdio.h>

long filesize(const char *filename)
{
FILE *f = fopen(filename,"rb");  /* open the file in read only */

long size = 0;
  if (fseek(f,0,SEEK_END)==0) /* seek was successful */
      size = ftell(f);
  fclose(f);
  return size;
}