我需要确定文件的字节大小。便携式获取C/C++文件大小的方法
编码语言是C++,代码应该可以在Linux,Windows和任何其他操作系统上使用。这意味着使用标准的C或C++函数/类。
这个微不足道的需求显然没有无足轻重的解决方案。
我需要确定文件的字节大小。便携式获取C/C++文件大小的方法
编码语言是C++,代码应该可以在Linux,Windows和任何其他操作系统上使用。这意味着使用标准的C或C++函数/类。
这个微不足道的需求显然没有无足轻重的解决方案。
使用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();
Simples:
std::ifstream ifs;
ifs.open("mybigfile.txt", std::ios::bin);
ifs.seekg(0, std::ios::end);
std::fpos pos = ifs.tellg();
在32位系统上,size_t是32位。所以这会导致4GB或更大的文件失败。 – user9876 2010-03-11 10:42:34
我没有参考就把它写下来了。看看我的代码有一些问题,我已经纠正。 – 2010-03-11 11:03:33
如果你只需要文件大小,这当然是矫枉过正,但总的来说,我会去与Boost.Filesystem f或平台无关的文件操作。 除其他属性的功能包含
template <class Path> uintmax_t file_size(const Path& p);
您可以找到参考here。虽然Boost Libraries可能看起来很庞大,但我发现它经常非常有效地实现它。你也可以只提取你需要的功能,但这可能证明很难,因为Boost相当复杂。
您可以使用stat系统调用:
#ifdef WIN32
_stat64()
#else
stat64()
值得注意的是'stat'系列函数是POSIX的一部分,因此它们也可以在UNIX和类UNIX系统上工作。 – 2010-07-30 17:52:53
通常我们想要得到的东西中最便携的方式进行,但在某些情况下,尤其是这样的,我会强烈建议使用系统的API以获得最佳性能。
可移植性要求您使用最小公分母,这将是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;
}
如果在32位长的int平台上有大于2GB的文件,那就太糟糕了 – 2012-01-24 17:53:20
@DavidHeffernan这些函数有64位版本。但是,除此之外,这要求您能够打开文件,速度也要慢很多。 – chacham15 2012-08-02 01:28:35
http://stackoverflow.com/questions/2282549/c-getting-incorrect-file-size/2289423#2289423 – 2010-03-11 11:48:28