程序如何在不读取整个文件的情况下确定文件的大小?

时间:2014-02-18 15:00:39

标签: performance file filesize

在问题Using C++ filestreams (fstream), how can you determine the size of a file?中,最常见的答案是以下C ++代码段:

ifstream file("example.txt", ios::binary | ios::ate);
return file.tellg();

自己运行我发现任意大文件的大小可以通过单个读取操作即时确定。

传统上我会假设要确定文件的大小,必须逐字节地移动它,添加到字节计数器。这是如何实现的呢?元数据?

3 个答案:

答案 0 :(得分:2)

文件的大小嵌入在文件系统的文件元数据中。不同的文件系统有不同的方式来存储这些信息。

编辑显然,这是一个不完整的答案。当有人提供答案时,他会在ex3或ntfs这样的公共文件系统上举例说明,或者确切知道文件大小是如何知道和存储的,我将删除这个答案。

答案 1 :(得分:0)

文件大小作为元数据存储在大多数文件系统上。除了上面的GI Joe的回答,你可以在posix系统上使用stat函数:

stat(3) manpage

struct stat     statbuf;
stat("filename.txt", &statbuf);
printf("The file is %d bytes long\n", statbuf.st_size);

答案 2 :(得分:-1)

设置ios::ate时,初始位置将是文件的结尾,但您可以随后进行搜索。

tellg返回输入流中当前字符的位置。另一个关键部分是ios::binary

所以当它打开文件流并告诉你当前位置(这是文件的结尾)时,它会为你找到文件的末尾。我想你可以说它在某种程度上是一种破解,但逻辑是有道理的。

如果您想了解文件流在较低级别的工作方式,请阅读StackOverflow question