Функции определения существования файла типа 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: если знаете другие примеры реализации — поделитесь...