Как получить размер файла, превышающий 4 Гб? - PullRequest
10 голосов
/ 02 марта 2010

Я сделал простую функцию, которая получает размер файла.

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

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

     return size;

}//file_size

Это работает нормально, но если у меня есть файл, размер которого больше 4 ГБ, чем я получаю отрицательное число, и, конечно, это не правильный размер файла. Итак, как я могу получить такой большой размер файла? Я думаю, что возвращаемое значение должно быть чем-то вроде int, но я не знаю что, и я не думаю, что это решило бы мою проблему.

Спасибо

Kampi

Обновление:

Привет!

Я нашел решение. Я должен использовать __stat64. Я изменил свою функцию, и теперь она получает реальный размер. Я проверил это с большим файлом 8 ГБ.

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", чтобы распечатать его.

Ответы [ 5 ]

5 голосов
/ 02 марта 2010

Вы можете использовать функцию Win32 GetFileSizeEx.

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;
4 голосов
/ 02 марта 2010

Возможно, вы можете использовать _stat64 .

2 голосов
/ 02 марта 2010

В таких случаях возвращаемое значение stat() может быть -1, а errno установлено на EOVERFLOW.

Страница man для stat на моем компьютере (64-битная x86) гласит:

EOVERFLOW

(stat ()) путь относится к файлу, чей размер не может быть представлен в типе off_t. Это может произойти, когда приложение скомпилировано на 32-битной платформа без -D_FILE_OFFSET_BITS = 64 вызывает stat () для файла, размер которого превышает (2 << 31) -1 бит. </p>

2 голосов
/ 02 марта 2010

st_size определяется как long в wchar.h, так что вы можете попробовать long вместо int

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
0 голосов
/ 02 марта 2010

Я думаю, проблема в том, что размер файла больше, чем INT_MAX, так что он дает вам отрицательные значения.

Возможно, вы можете выполнить приведение типов для длинных типов данных, это может сработать.

В противном случае используйте функцию fseek, ftell. затем вычтите указатель конечного файла из указателя начального файла. Это также даст вам размер файла. (количество байтов).

...