Как определить, есть ли файл на диске?
От: Аноним  
Дата: 26.07.01 23:15
Оценка: 840 (65) -5
Статья:
Как определить, есть ли файл на диске?
Автор(ы): Игорь Ткачёв, Павел Блудов, Игорь Вартанов, Игорь Сухов, Александр Шаргин


Авторы:
IT
Alexander Shargin
Igor Sukhov
Игорь Вартанов
Блудов Павел

Аннотация:
11 способов как это сделать
Поправьте, есть баг.
От: SergH Россия  
Дата: 21.04.03 15:23
Оценка: 14 (1)
Нарвался с GetFileAttributes, актуально для всех. Нужно проверять GetLastError. Иначе, если, например, доступ запрёщен, программа будет думать, что файла нет.
Делай что должно, и будь что будет
System.IO.File.FileExists?
От: Shire  
Дата: 23.10.02 08:27
Оценка:
Нет (уже?) такой функции. Есть System.IO.File.Exists(string)

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemiofileclassexiststopic.asp
Да ладно, чего там "извращенцы"...
От: The Lex Украина  
Дата: 21.01.02 23:02
Оценка:
:) Мне очень понравилось! В высшей степени занимательно. По крайней мере я сам теперь перейду от ::FindFirstFile(...) к ::GetFileAttributes(...). И к .NET присматриваюсь — так что статья написана очень здорово!
Голь на выдумку хитра, однако...
I would prefer this:
От: Аноним  
Дата: 02.10.01 18:56
Оценка:
#include <sys/types.h>
#include <sys/stat.h>

bool FileExists(const char* szFilePath)
{
struct _stat buf;

return _stat( szFilePath, &buf ) == 0;
}

There is also a standard series of such function to get status information on a file: _stat, _wstat, _tstat, ....
A sense of each of them is pretty clear.
Можно еще и вот так:
От: Аноним  
Дата: 12.08.01 22:58
Оценка: 1 (1)
#include <stdio.h>

bool FileExist()
{
FILE* testfile = fopen(file_name,"r");
if(!testfile)
return true;
else
fclose(testfile);
return false;
}

Также абсолютно портабельно, но не использует потоки и поэтому, вероятно, быстрее.
А функцию SearchPath забыли?
От: raspopov Россия https://www.cherubicsoft.com/
Дата: 30.07.01 20:08
Оценка:
ну вы и извращенцы :)
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 27.07.01 23:15
Оценка:
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re: Можно еще и вот так:
От: Riziy  
Дата: 08.01.02 03:55
Оценка:
А если файл существует, но открыт другим процессом с запретом доступа для остальных?
Тогда
fopen(file_name,"r");
вернёт NULL


В другой программе было исполнено нечто вроде этого:

FILE* f;
f = _fsopen( file_name, "r+b", _SH_DENYRW );

(в Borland C++ fsopen и SH_DENYRW)
Дополнение
От: Аноним  
Дата: 12.08.01 23:04
Оценка:
Пардон, ошибся. Сигнатура функции должна быть такой:

bool FileExist(char* file_name)
{
...

Но это, в принципе, не сцщественно. Sapienti sat :)
Re:ну вы и извращенцы :)
От: Блудов Павел Россия  
Дата: 09.08.01 15:10
Оценка:
Видите ли, Дмитрий, это довольно популярный вопрос. И сдесь собраны наиболее удачные ответы. Выбирайте на свой вкус :)
Re:А функцию SearchPath забыли?
От: CooLer Россия http://bestsoft.far.ru
Дата: 05.08.01 15:18
Оценка:
Пример в студию :)
"Выше голову" — сказл палач, надевая петлю
Re:А функцию SearchPath забыли?
От: Блудов Павел Россия  
Дата: 09.08.01 15:31
Оценка:
bool FileExists (LPCTSTR fname)
{
return 0 != ::SearchPath(_T(""), // Avoid ambiguous paths
fname, NULL, NULL, NULL, NULL);
}

Очень важно, чтобы первым параматром была пустая строка.
Иначе такой вот код может сработать а может и нет:

bool b = FileExists(_T("hal.dll"));
if (b)
::DeleteFile(_T("hal.dll"));

Дело в том, что если бы первый параметр был NULL,
то ::SearchPath() нашла бы файлик, а вот ::DeleteFile() — нет.
Re: Поправьте, есть баг.
От: Peshuha Россия  
Дата: 23.07.03 08:17
Оценка:
Может кто уже говорил ?...
а я пользуюсь:

bool FileExist(LPCTSTR path){return _access(path, NULL) == NULL;}
... Мы не привыкли отступать! И расколоть его поможет киножурнал "Хочу Все Знать"! ;)
Re: Как определить, есть ли файл на диске?
От: Аноним  
Дата: 23.07.03 13:47
Оценка:
Здравствуйте, Игорь Ткачёв, Павел Блудов, Игорь Вартанов, Игорь , Вы писали:

Долго смеялся но потом грусно стало


  BOOL ffd = CreateDirectoryW(
_T("\\\\?\\C:\\12345678901234567890123456789012345678901234567890123456789012345678\
1234567890123456789012345678901234567890\
\\9012345678901234567890123456789012345678901234567890\
\\1234567890123456789012345678901234567890123456789012\
345678901234567890123456789012345678901234567\
89012345678901234567890\
\\123456789012345678901234567890123456789012345678901\
234567890123456789012345678901234567890123456789012345678901234567890"),
  NULL);
if (ffd == 0) 
{ 
  DWORD err = GetLastError();
}

  hFile = CreateFileW(
_T("\\\\?\\C:\\12345678901234567890123456789012345678901234567890123456789012345678\
1234567890123456789012345678901234567890\
\\9012345678901234567890123456789012345678901234567890\
\\1234567890123456789012345678901234567890123456789012\
345678901234567890123456789012345678901234567\
89012345678901234567890\
\\123456789012345678901234567890123456789012345678901\
234567890123456789012345678901234567890123456789012345678901234567890\\proba2.doc"), // open 
                0,              
                FILE_SHARE_READ,           // share for reading 
                NULL,                      // no security 
                CREATE_NEW,             // existing file only 
                FILE_ATTRIBUTE_NORMAL,     // normal file 
                NULL);  

  if (hFile == INVALID_HANDLE_VALUE) 
{ 
   DWORD   err = GetLastError();   
}


Найдите этот файл — другими способами кроме чем CreateFileW

Так что CreateFile — это не грамоздкий — а самый правильный путь
Re[2]: Как определить, есть ли файл на диске?
От: Alex Fedotov США  
Дата: 23.07.03 20:16
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Найдите этот файл — другими способами кроме чем CreateFileW


GetFileAttributesW, как и FindFirstFileW, c успехом примет такой путь на NT. В этом они ничем не отличаются от CreateFileW.

А>Так что CreateFile — это не грамоздкий — а самый правильный путь


Все относительно в этом мире.
-- Alex Fedotov
Re[3]: Как определить, есть ли файл на диске?
От: Аноним  
Дата: 24.07.03 06:23
Оценка:
Здравствуйте, Alex Fedotov, Вы писали:

AF>Здравствуйте, Аноним, Вы писали:


А>>Найдите этот файл — другими способами кроме чем CreateFileW


AF>GetFileAttributesW, как и FindFirstFileW, c успехом примет такой путь на NT. В этом они ничем не отличаются от CreateFileW.


А>>Так что CreateFile — это не грамоздкий — а самый правильный путь


AF>Все относительно в этом мире.


Согласен — но этих тонкостей не было

Хотя надо попробовать — Windows "Экплорер" и другие в этот директорий не зайдут
Re[2]: Как определить, есть ли файл на диске?
От: Аноним  
Дата: 24.07.03 09:46
Оценка:
Здравствуйте, Аноним, Вы писали:

Есть одна не точность CreateDirectoryW нельзя так вызывать — надо последовательно создавать эти директории.
Re[4]: Как определить, есть ли файл на диске?
От: Valerio Россия linkedin.com/in/boronin
Дата: 25.07.03 04:02
Оценка:
А>Хотя надо попробовать — Windows "Экплорер" и другие в этот директорий не зайдут
WinExplorer иммет внутри (судя по всему) код в стиле:

TCHAR szPath[MAX_PATH];


иначе мне тоже не понятно отношение IE к длинным именам файлов
проверял не так давно лично с IE6SP1 IIRC — до сих пор не поправили.
... << RSDN@Home 1.1 beta 1 >>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Re: Как определить, есть ли файл на диске?
От: hard.disk  
Дата: 25.07.03 07:23
Оценка:
В "Способе 8" правильней проверять что возвращает GetLastError(), если файла нету, то вернет ERROR_FILE_NOT_FOUND.
И еще ошибка в коде: хендл файла не закрывается при существовании файла.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.