Performance 程序如何在不读取整个文件的情况下确定文件的大小? 在这个问题中,上面的答案是下面的C++片段: ifstream文件(“example.txt”,ios::binary | ios::ate); 返回文件.tellg();

Performance 程序如何在不读取整个文件的情况下确定文件的大小? 在这个问题中,上面的答案是下面的C++片段: ifstream文件(“example.txt”,ios::binary | ios::ate); 返回文件.tellg();,performance,file,filesize,Performance,File,Filesize,我自己运行它时发现,任意大文件的大小可以通过一次读取操作立即确定 按照惯例,我会假设要确定文件的大小,必须逐字节地遍历文件,并添加到字节计数器中。这是如何实现的呢?元数据?当设置了ios::ate时,初始位置将是文件的结尾,但此后您可以自由查找 tellg返回当前字符在输入流中的位置。另一个关键部分是ios::binary 因此,当它打开文件流并告诉您当前位置(即文件的结尾)时,它会为您查找文件的结尾。我想你可以说这在某种程度上是一种黑客行为,但逻辑是有道理的 如果您想了解filestreams

我自己运行它时发现,任意大文件的大小可以通过一次读取操作立即确定


按照惯例,我会假设要确定文件的大小,必须逐字节地遍历文件,并添加到字节计数器中。这是如何实现的呢?元数据?

当设置了
ios::ate
时,初始位置将是文件的结尾,但此后您可以自由查找

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

因此,当它打开文件流并告诉您当前位置(即文件的结尾)时,它会为您查找文件的结尾。我想你可以说这在某种程度上是一种黑客行为,但逻辑是有道理的


如果您想了解filestreams如何在较低级别上工作,请阅读此内容。

大多数文件系统都将文件大小存储为元数据。除了上面GI Joe的答案之外,您还可以在posix系统上使用stat函数:


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


编辑显然,这是一个不完整的答案。当有人给出一个答案,他将在一个常见的文件系统(如ex3、ntfs或fat)上举例说明文件大小是如何知道和存储的,我将删除此答案。

在所有传统的文件系统中,文件大小不是作为指定值存储在文件元数据中吗?这不解释为什么操作是即时的。为什么您可以在不读取整个文件的情况下查找文件的结尾?@usr:您不需要,只需转到结尾即可。你不是在“读它”,问题是:它是如何工作的?你怎么知道终点的位置?如果你有一盘磁带,如果不通读它,你不知道它有多长。他想了解文件元数据。“按照惯例,我会假设要确定文件的大小,必须逐字节移动文件,添加到字节计数器。这是如何实现的?元数据?”您没有回答这个问题。您刚才说“只需调用此API,它是神奇的。”。您的回答是最直接的,即正在检索元数据。
struct stat     statbuf;
stat("filename.txt", &statbuf);
printf("The file is %d bytes long\n", statbuf.st_size);