我需要確定文件的字節大小。便攜式獲取C/C++文件大小的方法
編碼語言是C++,代碼應該可以在Linux,Windows和任何其他操作系統上使用。這意味着使用標準的C或C++函數/類。
這個微不足道的需求顯然沒有無足輕重的解決方案。
我需要確定文件的字節大小。便攜式獲取C/C++文件大小的方法
編碼語言是C++,代碼應該可以在Linux,Windows和任何其他操作系統上使用。這意味着使用標準的C或C++函數/類。
這個微不足道的需求顯然沒有無足輕重的解決方案。
使用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();
Simples:
std::ifstream ifs;
ifs.open("mybigfile.txt", std::ios::bin);
ifs.seekg(0, std::ios::end);
std::fpos pos = ifs.tellg();
在32位系統上,size_t是32位。所以這會導致4GB或更大的文件失敗。 – user9876 2010-03-11 10:42:34
我沒有參考就把它寫下來了。看看我的代碼有一些問題,我已經糾正。 – 2010-03-11 11:03:33
如果你只需要文件大小,這當然是矯枉過正,但總的來說,我會去與Boost.Filesystem f或平臺無關的文件操作。 除其他屬性的功能包含
template <class Path> uintmax_t file_size(const Path& p);
您可以找到參考here。雖然Boost Libraries可能看起來很龐大,但我發現它經常非常有效地實現它。你也可以只提取你需要的功能,但這可能證明很難,因爲Boost相當複雜。
您可以使用stat系統調用:
#ifdef WIN32
_stat64()
#else
stat64()
值得注意的是'stat'系列函數是POSIX的一部分,因此它們也可以在UNIX和類UNIX系統上工作。 – 2010-07-30 17:52:53
通常我們想要得到的東西中最便攜的方式進行,但在某些情況下,尤其是這樣的,我會強烈建議使用系統的API以獲得最佳性能。
可移植性要求您使用最小公分母,這將是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;
}
如果在32位長的int平臺上有大於2GB的文件,那就太糟糕了 – 2012-01-24 17:53:20
@DavidHeffernan這些函數有64位版本。但是,除此之外,這要求您能夠打開文件,速度也要慢很多。 – chacham15 2012-08-02 01:28:35
http://stackoverflow.com/questions/2282549/c-getting-incorrect-file-size/2289423#2289423 – 2010-03-11 11:48:28