Как проверить, существует ли файл в C ++ для программы Windows? - PullRequest
2 голосов
/ 21 января 2010

Это для программы только для Windows, поэтому переносимый код не является проблемой.

Мне нужно просто:

bool DoesFileExist( LPWSTR lpszFilename )
{
    // ...
}

Ответы [ 12 ]

14 голосов
/ 26 ноября 2008

Согласно почтенному Раймонду Чену, вы должны использовать GetFileAttributes, если вы суеверны .

9 голосов
/ 26 ноября 2008
7 голосов
/ 26 ноября 2008

Это немного более сложный вопрос. Нет 100% способа проверить наличие файла. Все, что вы можете проверить, это действительно «существование файла, к которому у меня есть определенный доступ». С учетной записью не суперпользователя очень возможно существование файла, к которому у вас нет доступа таким образом, что проверки доступа не выявят наличие файла.

Например. Возможно не иметь доступа к определенному каталогу. Тогда нет способа определить наличие файла в этом каталоге.

При этом, если вы хотите проверить наличие файла, у вас есть мера доступа для использования одного из следующих: _stat, _stat64, _stati64, _wstat, _wstat64, _wstati64

6 голосов
/ 26 ноября 2008

GetFileAttributes - это то, что вы ищете. Если он возвращает значение, которое не является INVALID_FILE_ATTRIBUTES, файл существует.

3 голосов
/ 21 января 2010

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

2 голосов
/ 21 января 2010

только для Windows? Использовать GetFileAttributes :

bool DoesFileExist( LPWSTR lpszFilename )
{
  return GetFileAttributes( lpszFilename ) != INVALID_FILE_ATTRIBUTES;
}

Или более строгая версия (согласно комментарию Сере Дери):

bool DoesFileExist( LPWSTR lpszFilename )
{
  return ( ( GetFileAttributes( lpszFilename ) != INVALID_FILE_ATTRIBUTES )
         && ( GetLastError() == ERROR_FILE_NOT_FOUND ) );
}

-

1 голос
/ 21 января 2010

Есть два распространенных способа сделать это в коде Windows. GetFileAttributes и CreateFile,

bool DoesFileExist(LPCWSTR pszFilename)
{
   DWORD dwAttrib = GetFileAttributes(pszFilename);
   if ( ! (dwAttrib & FILE_ATTRIBUTE_DEVICE) &&
        ! (dwAttrib & FILE_ATTRIBUTE_DIRECTORY))
   {
      return true;
   }
   return false;
}

Это скажет вам, что файл существует, но не скажет, есть ли у вас доступ к нему. для этого вам нужно использовать CreateFile.

bool DoesFileExist(LPCWSTR pszFilename)
{
    HANDLE hf = CreateFile(pszFilename,
                           GENERIC_READ,
                           FILE_SHARE_READ | FILE_SHARE_WRITE,
                           NULL,
                           OPEN_EXISTING,
                           FILE_ATTRIBUTE_NORMAL,
                           NULL);

    if (INVALID_HANDLE_VALUE != hf)
    {
        CloseHandle(hf);
        return true;
    }
    else if (GetLastError() == ERROR_SHARING_VIOLATION)
    {
        // should we return 'exists but you can't access it' here?
        return true;
    }

    return false;
}

Но помните, что даже если вы вернете истину после одного из этих вызовов, файл может все еще не существовать к тому времени, когда вы сможете открыть его. Во многих случаях лучше всего вести себя так, как будто файл существует, и изящно обрабатывать ошибки, когда его нет.

1 голос
/ 21 января 2010

Вот один из многих вариантов:

HANDLE handle = FindFirstFile(lpszFilename);
if (handle == INVALID_HANDLE_VALUE) 
    return false;
FindClose(handle);
return true;
0 голосов
/ 21 января 2010

Это должно сделать это.

#include <fstream>

bool DoesFileExist( LPWSTR lpszFilename )
{
  ifstream fin;
  fin.open(lpszFilename.c_str(), ifstream::in);
  fin.close();
  return !fin.fail();
}
0 голосов
/ 27 ноября 2008

По моему опыту, _access () прост и довольно переносим

#if defined(__MSDOS__) || defined(_Windows) || defined(_WIN32)
    bool file_exists =  _access(file_name,0) == 0;
#endif
#ifdef unix
    bool file_exists =  _access(file_name,F_OK) == 0;
#endif
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...