Как получить размер файла, который больше, чем 4 Гбита?

Я сделал простую функцию, который get's размер файла.

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

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

     return size;

}//file_size

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

Спасибо,

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" для распечатывания его.

10
задан kampi 2 March 2010 в 09:31
поделиться

5 ответов

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

4
ответ дан 3 December 2019 в 23:49
поделиться

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

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

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

0
ответ дан 3 December 2019 в 23:49
поделиться

Вы можете использовать функцию 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;
5
ответ дан 3 December 2019 в 23:49
поделиться

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
2
ответ дан 3 December 2019 в 23:49
поделиться

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

В man-странице для stat на моей (64-битной x86 машине) сказано:

EOVERFLOW

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

2
ответ дан 3 December 2019 в 23:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: