Как определить, есть ли файл на диске?
От: Аноним  
Дата: 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.
И еще ошибка в коде: хендл файла не закрывается при существовании файла.
Re: Как определить, есть ли файл на диске?
От: Keen the Green Россия  
Дата: 18.10.04 09:44
Оценка:
ИТП>11 способов как это сделать

А как быть вот с этим файлом?:

\\192.168.0.1\shara\failo.dat
K.T.G.
Re[2]: Как определить, есть ли файл на диске?
От: Keen the Green Россия  
Дата: 18.10.04 13:19
Оценка:
Здравствуйте, Keen the Green, Вы писали:


ИТП>>11 способов как это сделать


KTG>А как быть вот с этим файлом?:


KTG>\\192.168.0.1\shara\failo.dat


Вопрос снят, access работает нормально.
K.T.G.
Re: Как определить, есть ли файл на диске?
От: AntonKasimov Россия  
Дата: 22.11.04 15:10
Оценка:
Здравствуйте, Игорь Ткачёв, Павел Блудов, Игорь Вартанов, Игорь , Вы писали:

ИТП>Статья:



ИТП>Авторы:

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

ИТП>Аннотация:

ИТП>11 способов как это сделать

Ошибка в примере WTL надо вместо объекта CFileFind написать CFindFile
Re[3]: Как определить, есть ли файл на диске?
От: Slava Antonov Россия http://deadbeef.narod.ru
Дата: 15.02.05 00:09
Оценка:
Hello Alex Fedotov, you wrote:

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


Если все относительно, то относительна и фраза "все относительно в этом
мире". Т.о. делаем вывод, что не все относительно в этом мире.

ЗЫ: Философия...

--
Всего хорошего, Слава
Posted via RSDN NNTP Server 1.9
Re: надо писать так
От: Lepsik Гондурас https://www.kirdyk.club/
Дата: 12.12.06 16:16
Оценка: 14 (1)
Здравствуйте, SergH, Вы писали:

SH>Нарвался с GetFileAttributes, актуально для всех. Нужно проверять GetLastError. Иначе, если, например, доступ запрёщен, программа будет думать, что файла нет.




bool FileExists( const char *fname )
{
    if( fname == NULL || strlen(fname) == 0 )
    {
        return false;
    }
    DWORD dwAttrs = ::GetFileAttributes( fname );
    if( dwAttrs == DWORD(-1) )
    {
        DWORD dLastError = GetLastError();
        if(    ERROR_SHARING_VIOLATION == dLastError 
            || ERROR_LOCK_VIOLATION == dLastError 
            || ERROR_SHARING_BUFFER_EXCEEDED == dLastError )
        {
            return true;
        }else
        {
            return false;
        }
    }
    return true;
}
Re: Как определить, есть ли файл на диске?
От: Аноним  
Дата: 19.12.06 04:01
Оценка:
Здравствуйте, Игорь Ткачёв, Павел Блудов, Игорь Вартанов, Игорь , Вы писали:

ИТП>Статья:

ИТП>Как определить, есть ли файл на диске?
Автор(ы): Игорь Ткачёв, Павел Блудов, Игорь Вартанов, Игорь Сухов, Александр Шаргин


ИТП>Авторы:

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

ИТП>Аннотация:

ИТП>11 способов как это сделать

Ну и про bat файлы грех забывать...

if exist *.rpt echo Отчет получен
Re: Как определить, есть ли файл на диске?
От: Аноним  
Дата: 19.12.06 05:19
Оценка:
Здравствуйте, Игорь Ткачёв, Павел Блудов, Игорь Вартанов, Игорь , Вы писали:

ИТП>Статья:

ИТП>Как определить, есть ли файл на диске?
Автор(ы): Игорь Ткачёв, Павел Блудов, Игорь Вартанов, Игорь Сухов, Александр Шаргин


ИТП>Авторы:

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

ИТП>Аннотация:

ИТП>11 способов как это сделать

_findfirst вызывает FindFirstFile. Не стал бы указывать это отдельным методом.


insomnia.
Re[2]: Как определить, есть ли файл на диске?
От: Igor Sukhov  
Дата: 19.12.06 06:19
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Игорь Ткачёв, Павел Блудов, Игорь Вартанов, Игорь , Вы писали:


А>_findfirst вызывает FindFirstFile. Не стал бы указывать это отдельным методом.


А>insomnia.

То есть что ты предлагаешь ? После более чем пяти лет в эфире, взять и переименовать статью, как Киров в Вятку ?
* thriving in a production environment *
Re[3]: Как определить, есть ли файл на диске?
От: Аноним  
Дата: 19.12.06 10:06
Оценка:
Здравствуйте, Igor Sukhov, Вы писали:

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


А>>Здравствуйте, Игорь Ткачёв, Павел Блудов, Игорь Вартанов, Игорь , Вы писали:


А>>_findfirst вызывает FindFirstFile. Не стал бы указывать это отдельным методом.


А>>insomnia.

IS>То есть что ты предлагаешь ? После более чем пяти лет в эфире, взять и переименовать статью, как Киров в Вятку ?

Ветка "всплыла" вот я статью только и увидел.
Re[2]: Как определить, есть ли файл на диске?
От: ozolc  
Дата: 17.08.07 07:59
Оценка:
А>Ну и про bat файлы грех забывать...

А>if exist *.rpt echo Отчет получен


А как быть если заранее неизвестно название файла, но знаем расширение?
На С#?
Re: Как определить, есть ли файл на диске?
От: Hsilgos Беларусь  
Дата: 22.02.09 22:16
Оценка:
Господа, небольшое уточнение

bool FileExists(LPCTSTR fname)
{
 HANDLE hFile = ::CreateFile(
                fname, // file (or device) name
                0, // query access only
                FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, // share mode
                NULL, // security attributes
                OPEN_EXISTING, // disposition
                FILE_FLAG_NO_BUFFERING | FILE_FLAG_SEQUENTIAL_SCAN, // flags & attributes
                NULL // template file
                );
if (INVALID_HANDLE_VALUE != hFile)
{
  ::CloseHandle(hFile);
  return true;
}

if( ERROR_ACCESS_DENIED == GetLastError() )
  return true;

return false;
}
ХОЙ!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.