2014-02-18 49 views
3

在問題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(); 

運行它自己,我注意到的任意大小文件的大小可以瞬間確定,並用讀操作。

通常我會假設要確定一個文件的大小,必須逐字節地移動它,並添加到字節計數器中。這是如何取得的?元數據?

+0

是不是所有傳統文件系統中的文件大小都存儲爲文件元數據中的指定值? – Taosique

回答

2

文件的大小被嵌入在文件系統中的文件的元數據。不同的文件系統有不同的存儲這些信息的方式。

編輯顯然,這是一個不完整的答案。當有人會提供一個答案,他將在例如ex3或ntfs的公共文件系統上進行例證,或者確切知道如何知道和存儲文件大小,我將刪除該答案。

+0

你的答案是最直接的,即正在檢索_metadata_。 – Adrian

-1

當設置了ios::ate時,初始位置將是文件的結尾,但您可以隨後查找。

tellg返回輸入流中當前字符的位置。另一個關鍵部分是ios::binary

所以當它打開文件流並告訴你當前位置(這是文件的結尾)時,它會爲你找到文件的結尾。我想你可以說這是某種方式的破解,但邏輯是有道理的。

如果您想了解文件流如何在較低級別上工作,請閱讀此StackOverflow question

+0

這並不回答爲什麼操作是即時的。 – usr

+0

@usr:是的,它的確如此。 – Brian

+0

爲什麼你可以在沒有整體閱讀的情況下尋找文件的結尾? – usr

0

文件大小作爲元數據存儲在大多數文件系統上。除了上面特種部隊的回答,您可以使用POSIX系統的統計功能:

stat(3) manpage

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