2010-03-11 56 views
8

我需要确定文件的字节大小。便携式获取C/C++文件大小的方法

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

这个微不足道的需求显然没有无足轻重的解决方案。

+0

http://stackoverflow.com/questions/2282549/c-getting-incorrect-file-size/2289423#2289423 – 2010-03-11 11:48:28

回答

8

使用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(); 
+4

打开二进制文件或者你可能会得到错误的结果。文本ifstreams可以将'\ r \ n'转换为'\ n'翻译。 – MSalters 2010-03-11 14:11:42

+0

问题是tellg()返回一个streampos类型的值。它通常是一个int,但它也可以是另一种类型。虽然我会保留它作为答案。 – chmike 2010-03-11 14:18:58

+0

我的回答实际上反映了这一事实,因为我的第一次迭代不在我头顶,直到有人指出了错误并标记为失败。 – 2010-03-12 11:34:30

0

Simples:

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

在32位系统上,size_t是32位。所以这会导致4GB或更大的文件失败。 – user9876 2010-03-11 10:42:34

+0

我没有参考就把它写下来了。看看我的代码有一些问题,我已经纠正。 – 2010-03-11 11:03:33

3

如果你只需要文件大小,这当然是矫枉过正,但总的来说,我会去与Boost.Filesystem f或平台无关的文件操作。 除其他属性的功能包含

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

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

6

您可以使用stat系统调用:

#ifdef WIN32 
_stat64() 
#else 
stat64() 
+1

值得注意的是'stat'系列函数是POSIX的一部分,因此它们也可以在UNIX和类UNIX系统上工作。 – 2010-07-30 17:52:53

-1

通常我们想要得到的东西中最便携的方式进行,但在某些情况下,尤其是这样的,我会强烈建议使用系统的API以获得最佳性能。

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

如果在32位长的int平台上有大于2GB的文件,那就太糟糕了 – 2012-01-24 17:53:20

+1

@DavidHeffernan这些函数有64位版本。但是,除此之外,这要求您能够打开文件,速度也要慢很多。 – chacham15 2012-08-02 01:28:35