Standard C++ file size

来源:互联网 发布:搞怪声卡软件下载 编辑:程序博客网 时间:2024/06/06 01:40

groups中有一篇关于如何以标准的方式获得文件大小的帖子。帖子中指出一种方法,通过seek到文件末尾,并且进行tell获得当前的位置即可知道文件的大小。但是许多人指出该方式在不同系统上的表现是不一样的。

#include <fstream>#include <iostream>int main(){    std::ifstream in("somefile", std::ios::binary | std::ios::in);    in.seekg(0, ios::end);    std::cout << "file size: " << in.tellg() << std::endl;}

反对观点:

 

1. 有些系统(除unix, windows, mac),比如大型机系统(当然通常我们在pc上编程,这个不予考虑),text file和binary file是不同对待的,text file不能以binary方式打开,binary也不能以text方式打开。

 

2. 使用binary方式得到的文件大小和text方式得到的文件大小是不同,主要是因为text translation。在不同的系统上对于line ending的定义不同的,在windows上,是“\r\n”,而unix上是'\n',在mac上是'\r'。当无论是那种line ending,从file中读入后都是’/n'。在windows上读取到实际大小会小于存储在disk上的大小。

 

3. 文件大小的定义模糊。文件大小可能指,存储在disk上的文件所占用的扇区总和的大小,也可能是字符的个数,等等。可能文件中包含一些metadata,比如BOM。windows上的fseek在遇到bom的情况下,定义文件的起始处为BOM之后的数据,也就是说是实际文件的内容。

 

4. 使用seek到end的方式获得文件大小是不可移植的。在unix文件系统中,许多设备都被当成文件,但是不支持seek to end的方式,只能在读取内容后才能确定大小,比如/dev/tty。

 

5. 使用seek to end方式获得大小可能大于实际大小,因为文件的最后部分可能存在一些padding,这些garbbage数据也可能被计算在内。

 

总结:要想使用seek to end方式获得文件大小,在windows和unix上是可行的。如果要获得更加合理的大小,只能通过调用os特定的函数,比如windows上的GetFileSize*。

 

reference:

http://groups.google.com/group/comp.lang.c++/browse_thread/thread/a91eb83ba0e8377f/d27c88e57faadeb5?hl=en&#d27c88e57faadeb5