11

ファイルのサイズを取得する単純な関数を作成しました。

int file_size( char * filename )
{
     int size;
     struct stat st;

     stat( filename, &st );
     size = st.st_size;

     return size;

}//file_size

正常に動作していますが、サイズが4Gbより大きいファイルがある場合、負の数が返されます。もちろん、これは正しいファイルサイズではありません。では、どうすればこのような大きなファイルのサイズを取得できますか?戻り値はintのようなものでなければならないと思いますが、私には何がわからないので、それで問題が解決するとは思いません。

ありがとう、

カンピ

アップデート:

やあ!

私は解決策を見つけました。__stat64を使用する必要があります。関数を変更しましたが、実際のサイズを取得しています。8Gbの大きなファイルでテストしました。

unsigned long long int file_size( char * filename )
{
    unsigned long long int size;
    struct __stat64 st;

    __stat64( filename, &st );
    size = st.st_size;

   return size;

}//file_size

そして通知:

printfを使用したときは、「%I64d」を使用して印刷する必要がありました。

4

5 に答える 5

5

Win32GetFileSizeEx関数を使用できます。

HANDLE aFile = CreateFile
(
  filename,
  FILE_READ_ATTRIBUTES,
  0,
  NULL,
  OPEN_EXISTING,
  FILE_ATTRIBUTE_NORMAL,
  NULL
);

if (aFile != INVALID_HANDLE_VALUE)
{
  long long aSize;
  GetFileSizeEx(aFile, &aSize);

  CloseHandle(aFile);
  return aSize;
}
else
  return -1;
于 2010-03-02T07:01:23.800 に答える
5

おそらく_stat64を使用できます。

于 2010-03-02T07:06:02.640 に答える
2

st_sizewchar.hではlongとして定義されているため、intではなくlongで試すことができます。

struct stat {
    ....
    _off_t     st_size;
    ....
}

....

typedef long _off_t;  

こんな感じかもしれない

long file_size( char * filename )
{
     long size;
     struct stat st;

     stat( filename, &st );
     size = st.st_size;

     return size;

}//file_size
于 2010-03-02T07:08:18.270 に答える
2

このような場合、の戻り値はstat()-1であり、にerrno設定されEOVERFLOWます。

stat私の(64ビットx86マシン)のマニュアルページには次のように書かれています。

EOVERFLOW

(stat())パスは、off_t型でサイズを表すことができないファイルを参照します。これは、-D_FILE_OFFSET_BITS = 64を使用せずに32ビットプラットフォームでコンパイルされたアプリケーションが、サイズが(2 << 31)-1ビットを超えるファイルでstat()を呼び出す場合に発生する可能性があります。

于 2010-03-02T07:19:50.243 に答える
0

問題は、ファイルサイズがINT_MAXより大きいためだと思います。そのため、負の値が返されます。

おそらく、長いデータ型に対して型キャストを行うことができますが、機能する可能性があります。

それ以外の場合は、fseek、ftell関数を使用します。次に、開始ファイルポインタから終了ファイルポインタを減算します。また、ファイルサイズも表示されます。(バイト数)。

于 2010-03-02T07:04:59.713 に答える