Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проверка файла на пустоту

12K
03 мая 2007 года
mathers
33 / / 15.01.2007
Проблема такая: нужно сделать проверку файла на существование и на непустоту. Сейчас пока сделал проверку с помощью fopen, но это как то криво помоему(проверка на пустоту не реализована вообще пока).
В идеале требуется какая нить функция, которая в случае если файл содержит какую нить инфу, возвращала не ноль, а в случае если файла не существует, или он пуст - возвращала NULL. Есть ли что то подобное?
25K
03 мая 2007 года
Kortar
14 / / 23.04.2007
не пойдет?

 
Код:
WIN32_FIND_DATA Data;
HANDLE hFile = FindFirstFile("MyFile.bin",&Data);
if (hFile)
{
   DWORD size;
   GetFileSize(hFile,&size);
}
263
04 мая 2007 года
koltaviy
816 / / 16.12.2004
Цитата: mathers
Проблема такая: нужно сделать проверку файла на существование и на непустоту. Сейчас пока сделал проверку с помощью fopen, но это как то криво помоему(проверка на пустоту не реализована вообще пока).
В идеале требуется какая нить функция, которая в случае если файл содержит какую нить инфу, возвращала не ноль, а в случае если файла не существует, или он пуст - возвращала NULL. Есть ли что то подобное?


А чем не устраивает-то?:

Код:
bool IfFileExistsAndIsNotEmpty( AnsiString fPath )
{
 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;
}
12K
04 мая 2007 года
mathers
33 / / 15.01.2007
Цитата: Kortar
не пойдет?

 
Код:
WIN32_FIND_DATA Data;
HANDLE hFile = FindFirstFile("MyFile.bin",&Data);
if (hFile)
{
   DWORD size;
   GetFileSize(hFile,&size);
}



У меня почему то GetFileSize получает какие то страшные числа, причём каждый раз - разные для одного и того же файла. Даже для пустого.

1.8K
05 мая 2007 года
Death Knight
139 / / 19.02.2006
Можно все сделать по простому считать из файла значения в какую нить переменную а потом if perem = ' ' пустой файл
255
05 мая 2007 года
Dart Bobr
1.4K / / 09.04.2004
а ты точно значение переменной смотришь, а не указателя?? по-моему эта функция глючить не должна ;)
279
06 мая 2007 года
bave
456 / / 07.03.2004
Ну раз уж проблема с GetFileSize...
 
Код:
FILE *f = fopen(filename, "r");
fseek(f, 0, SEEK_END);
unsigned int size = ftell(f);
12K
07 мая 2007 года
mathers
33 / / 15.01.2007
Цитата: Dart Bobr
а ты точно значение переменной смотришь, а не указателя?? по-моему эта функция глючить не должна ;)



Можете сами проверить.

Вот весь код:

Код:
WIN32_FIND_DATA Data;
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
3
07 мая 2007 года
Green
4.8K / / 20.01.2000
Для mathers и Kortar:
Я настоятельно рекомендую почитать описание функции GetFileSize в MSDN.
Там всё предельно ясно сказано.
12K
08 мая 2007 года
mathers
33 / / 15.01.2007
Цитата: Green
Для mathers и Kortar:
Я настоятельно рекомендую почитать описание функции GetFileSize в MSDN.
Там всё предельно ясно сказано.



Я читал. Вроде бы всё правильно.
Может расскажешь, в чём подвох?

255
08 мая 2007 года
Dart Bobr
1.4K / / 09.04.2004
Цитата:
lpFileSizeHigh
[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.
так вы мсдн читаете, товарищи.. ))

12K
08 мая 2007 года
mathers
33 / / 15.01.2007
Цитата: Dart Bobr
ключевое слово high-order word. То-есть если у тебя файл меньше 4гиг, то нужно так:
printf("size: %d\n",GetFileSize(hFile,&size));
если файл больше то тогда твой размер будет вычисляться по формуле:
GetFileSize(hFile,&size) + size * 2^32.
так вы мсдн читаете, товарищи.. ))



Хмм. Помоему здесь функция размер не возвращает? А пишет его в size. Так что сия строчка мне не понятна :)

 
Код:
printf("size: %d\n",GetFileSize(hFile,&size));
В любом случае, если делать так, как ты написал - всегда выдаётся "-1"
3
08 мая 2007 года
Green
4.8K / / 20.01.2000
Цитата: mathers
Хмм. Помоему здесь функция размер не возвращает? А пишет его в 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:

 
Код:
DWORD size = GetFileSize(hFile, NULL);


Цитата: mathers

 
Код:
printf("size: %d\n",GetFileSize(hFile,&size));
В любом случае, если делать так, как ты написал - всегда выдаётся "-1"


А что такое -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.

Т.о. мы приходим к коду:

 
Код:
HANDLE hFile = CreateFile("C:\\001.txt", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (INVALID_FILE_SIZE == hFile) {
    ---- ERROR ----
}

DWORD size = GetFileSize(hFile, NULL);


Так что НАСТОЯТЕЛЬНО рекомендую читать MSDN и пытаться думать.
12K
08 мая 2007 года
mathers
33 / / 15.01.2007
Не пинайте только плз :) Заработало :)

Green, спасибо!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог