Проверка файла на пустоту
В идеале требуется какая нить функция, которая в случае если файл содержит какую нить инфу, возвращала не ноль, а в случае если файла не существует, или он пуст - возвращала NULL. Есть ли что то подобное?
HANDLE hFile = FindFirstFile("MyFile.bin",&Data);
if (hFile)
{
DWORD size;
GetFileSize(hFile,&size);
}
В идеале требуется какая нить функция, которая в случае если файл содержит какую нить инфу, возвращала не ноль, а в случае если файла не существует, или он пуст - возвращала NULL. Есть ли что то подобное?
А чем не устраивает-то?:
{
char str[255];
ifstream file_re;
file_re.open( fPath.c_str() );
if ( ! file_re )
{
return false;
}
while ( ! file_re.getline( str, sizeof(str) ).eof() )
{
return true;
}
return false;
}
HANDLE hFile = FindFirstFile("MyFile.bin",&Data);
if (hFile)
{
DWORD size;
GetFileSize(hFile,&size);
}
У меня почему то GetFileSize получает какие то страшные числа, причём каждый раз - разные для одного и того же файла. Даже для пустого.
fseek(f, 0, SEEK_END);
unsigned int size = ftell(f);
Можете сами проверить.
Вот весь код:
HANDLE hFile = FindFirstFile("C:\\001.txt",&Data);
if(hFile == INVALID_HANDLE_VALUE)
printf("INVALID HANDLE\n");
else
{
DWORD size;
GetFileSize(hFile,&size);
printf("size: %d\n",size);
}
Вывел результат:
size: -858993460
Я настоятельно рекомендую почитать описание функции GetFileSize в MSDN.
Там всё предельно ясно сказано.
Я настоятельно рекомендую почитать описание функции GetFileSize в MSDN.
Там всё предельно ясно сказано.
Я читал. Вроде бы всё правильно.
Может расскажешь, в чём подвох?
[out] Pointer to the variable where the high-order word of the file size is returned. This parameter can be NULL if the application does not require the high-order word.
ключевое слово high-order word. То-есть если у тебя файл меньше 4гиг, то нужно так:
printf("size: %d\n",GetFileSize(hFile,&size));
если файл больше то тогда твой размер будет вычисляться по формуле:
GetFileSize(hFile,&size) + size * 2^32.
так вы мсдн читаете, товарищи.. ))
printf("size: %d\n",GetFileSize(hFile,&size));
если файл больше то тогда твой размер будет вычисляться по формуле:
GetFileSize(hFile,&size) + size * 2^32.
так вы мсдн читаете, товарищи.. ))
Хмм. Помоему здесь функция размер не возвращает? А пишет его в size. Так что сия строчка мне не понятна :)
Ещё раз настоятельно рекомендую читать MSDN, а не придумывать самому, что куда возвращается.
[QUOTE=MSDN]
If the function succeeds, the return value is the low-order doubleword of the file size
[/QUOTE]
Кроме того, как уже сказал Dart Bobr, если файл заведомо меньше 4Гб, то второй аргумент вообще не нужен можем передавать NULL:
А что такое -1 ?
Читаем MSDN!
[QUOTE=MSDN]
If the function fails and lpFileSizeHigh is NULL, the return value is INVALID_FILE_SIZE. To get extended error information, call GetLastError.
[/QUOTE]
Пробовал получить информацию об ошибке? Попробуй.
Код ошибки будет 6, т.е. "The handle is invalid."
Ой, а что же у нас с хендлом? А как мы его получили?
С помощью функции FindFirstFile. Читаем в MSDN об этой фукнкции:
[QUOTE=MSDN]
If the function succeeds, the return value is a search handle used in a subsequent call to FindNextFile or FindClose.
[/QUOTE]
Написано, что мы можем использовать полученный т.о. хендл для GetFileSize? НЕТ.
А как же нам получить нужный хендл?
Читаем в MSDN какой же хендл надо передавать в GetFileSize:
[QUOTE=MSDN]
hFile
[in] Handle to the file whose size is to be returned. This handle must have been created with either the GENERIC_READ or GENERIC_WRITE access right. For more information, see File Security and Access Rights.
[/QUOTE]
Если подумать логически или тыкнуть на ссылку "File Security and Access Rights", то обнаружится, что соотв. хендл для файла можно получить вызовом функции CreateFile.
Т.о. мы приходим к коду:
if (INVALID_FILE_SIZE == hFile) {
---- ERROR ----
}
DWORD size = GetFileSize(hFile, NULL);
Так что НАСТОЯТЕЛЬНО рекомендую читать MSDN и пытаться думать.
Green, спасибо!