2010-03-11 54 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