Я сделал простую функцию, который 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" для распечатывания его.
Я думаю, проблема в том, что размер файла больше INT_MAX, поэтому он дает вам отрицательные значения.
Возможно, вы можете выполнить приведение типа для длинного типа данных, это может сработать.
В противном случае используйте функцию fseek, ftell. затем вычтите указатель на конец файла из указателя на начальный файл. Это также даст вам размер файла. (количество байтов).
Вы можете использовать функцию 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;
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
В таких случаях возвращаемое значение stat()
может быть -1, а errno
установлено в EOVERFLOW
.
В man-странице для stat
на моей (64-битной x86 машине) сказано:
EOVERFLOW
(stat()) путь ссылается на файл, чей размер которого не может быть представлен в типе off_t. Это может произойти, когда приложение, скомпилированное на 32-битной платформе без -D_FILE_OFFSET_BITS=64 вызывает stat() на файле, размер которого превышает (2<<31)-1 биты.