Аналог PHP-шной file_exists в C++

Функции определения существования файла типа PHP-шной file_exists в C++, увы, нет, но можно написать свою.
forum.developing.ru подсказал несколько возможных реализаций.

1. WinAPI CreateFile

bool file_exists(LPCTSTR strFileName)
{
 HANDLE hFile = ::CreateFile(strFileName,
 GENERIC_READ,
 FILE_SHARE_READ,
 NULL,
 OPEN_EXISTING,
 FILE_ATTRIBUTE_NORMAL,
 NULL);
 if (hFile != INVALID_HANDLE_VALUE)
 {
 ::CloseHandle(hFile);
 return true;
 }
 return false;
}

Но тут есть минус. Если файл полность захвачен каким-то приложением в эксклюзивном режиме, то CreateFile не сможет его открыть даже на чтение и вернет результат, что нет такого файла.

2. WinAPI GetFileAttributes

Вместо CreateFile в Windows можно воспользоваться функцией GetFileAttributes (). Она не открывает файл и проще в использовании.

bool file_exists(LPCTSTR strFileName)
{
 return GetFileAttributes(strFileName) != 0xFFFFFFFF;
}

Но в таком виде она будет срабатывать и на папки. исправить это можно так:

bool file_exists(LPCTSTR strFileName)
{
 DWORD dwAttr = GetFileAttributes(strFileName);
 return (dwAttr != 0xFFFFFFFF) && (0 == (dwAttr & FILE_ATTRIBUTE_DIRECTORY));
}

3. Функция access

Она удобна тем, что позволяет проверить не только существование файла, но и режим доступа. То есть можно проверить и возможность записи в файл. Эта функция не требует WinAPI и будет работать на любой платформе.

bool file_exists(char *pathname){
 return !access(pathname, 0); // 00 - Проверка только на существование
}

Какой применять — решать вам.

PS: если знаете другие примеры реализации — поделитесь...

Поблагодарить автора

Оставить комментарий

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>