2011-12-30 6 views
0

Objective-Cのメソッドを使用せずに、Cの中でファイルのサイズを取得するために、以下のコードをObjective Cプログラムで作成しました。これはうまく動作し、小さなサイズのファイルでチェックするときに正しいサイズを与えます。しかし、大きなファイル(7GBのファイルでテスト)では、このサイズの変数はファイルのサイズを0として返します。誰も私がこの問題を解決するのを助けることができますか?大きなファイルのサイズを取得するCのサイズを返す0

//filePath is a string parameter which takes the path of the file 
    FILE *fp=nil; 
    const char *filePathInToChar = [filePath UTF8String]; 
    fp = fopen(filePathInToChar, "rb"); 
    fseek(fp, 0, SEEK_END); 
    long size = ftell(fp); 

答えて

2

ftellは、ファイルストリーム内の現在の位置をlong intとして返します。これは、32ビットシステムでは通常最大値が2^31 - つまり2GBです。

あなたはstat(あなたが実際にファイルを開閉する必要はありません)を使用することができます:

#include <sys/stat.h> 

struct stat buf; 
stat(filePathInToChar, &buf); 
off_t size = buf.st_size; 

off_tは、通常は64ビットであるlong longでなければなりません。

+0

thnxこれは魔法をした – user1120633

1

ftello()を使用してください。 off_tを返します。これはDarwinの下でlong longに解決されます。

+0

ありがとうございました。私はそれを使用しました。 'off_t size = ftello(fp);' まだ値はゼロです。私が使ったこのコードは正しいですか? – user1120633

+0

'fp'がNULLでないことを確認してください。 (そして、 'nil'を使わないでください; Objective-Cタイプのためです。) –

+0

fpはnullではありません。それが確認されます。 – user1120633

0

7ギガバイト - > 7516192768バイト

ご使用のプラットフォーム上longが唯一の32ビットである場合には(それが署名していますので)、保持することができる最大値は2^31である - > 2147483648 - > 2ギガバイトたとえそれを署名なしにしたとしても、最大4GBしか表現できません。より大きなタイプを使用する必要があります。 はコンパイラでサポートされている可能性があります。試してみてください.64ビットで、その値を保持するのに十分な大きさです。 int64_t<stdint.h>に入れてサポートされているかどうかを確認することもできます。

0

fopen()コールの後にfpNULLかどうかを確認しましたか?

if (fp) { 
    /* fseek() to SEEK_END and then ftell() to get position */ 
} 
else { 
    fprintf(stderr, "Something went wrong!\n"); 
} 

nilNULLではありません。 CポインタにはNULLを使用してください。

0

シークを使用しても、ファイルのサイズはわかりません。最高でも、ファイル内の文字数がわかりますが、インプリメンテーションが容易になるような情報が返される可能性が高くなります。ファイルのサイズを知りたければ、stat()のようなものに頼らざるを得ないものや、使いやすくするためにカプセル化されたものなどがあります。 Boostのファイルシステムライブラリから。

関連する問題