C / Cで、ファイルサイズを取得するためのポータブルな方法++
-
19-09-2019 - |
質問
私は、ファイルのバイトサイズをdeterminする必要があります。
コーディング言語は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();
他のヒント
あなたはのstatシステムコールを使用することができます:
#ifdef WIN32
_stat64()
#else
stat64()
あなただけのファイルサイズが必要な場合は、これは確かに行き過ぎですが、一般的に、私は<のhref = "http://www.boost.org/doc/libs/1_42_0/libs/filesystem/doc/indexとなるだろう。 HTM」のrel = "nofollowをnoreferrer"> Boost.Filesystem のプラットフォームに依存しないファイル操作のために。 他の属性の機能の中には含まれています。
template <class Path> uintmax_t file_size(const Path& p);
あなたは、参照を見つけることができますここを。 Boostライブラリが巨大に見えるかもしれませんが、私はそれは多くの場合、非常に効率的に物事を実装することが判明しました。ブーストはかなり複雑であるとして、あなたはまた、唯一のあなたが必要とする機能が、困難な証明この威力を抽出できます。
最も単純ます:
std::ifstream ifs;
ifs.open("mybigfile.txt", std::ios::bin);
ifs.seekg(0, std::ios::end);
std::fpos pos = ifs.tellg();
多くの場合、我々は、ほとんどのポータブルな方法で物事を成し遂げるしたいのですが、特定の状況では、特にこのように、私は強く、最高のパフォーマンスのために、システムの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;
}