如何检查C ++中的文件是否存在于Windows程序中?

时间:2010-01-21 19:36:21

标签: c c++ windows winapi filesystems

这适用于仅限Windows的程序,因此便携式代码不是问题。

我只需要:

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

12 个答案:

答案 0 :(得分:14)

根据古老的Raymond Chen的说法,你应该use GetFileAttributes if you're superstitious

答案 1 :(得分:9)

答案 2 :(得分:7)

这是一个复杂的问题。没有100%的方法来检查文件是否存在。你可以检查的只是“我有一定程度访问权限的文件的存在。”使用非超级用户帐户,存在一个您无权访问的文件,访问检查不会显示文件的存在。

例如。可以无法访问特定目录。然后无法确定该目录中是否存在文件。

话虽如此,如果你想检查文件的存在,你有一定的访问权限,可以使用以下方法之一:_stat,_stat64,_stati64,_wstat,_wstat64,_wstati64

答案 3 :(得分:6)

GetFileAttributes正是您要找的。如果它返回的值不是INVALID_FILE_ATTRIBUTES,则该文件存在。

答案 4 :(得分:3)

打开它。您无法可靠地测试多任务操作系统上是否存在文件。当你打开它时,你可以确保它不会消失。

答案 5 :(得分:2)

仅限Windows?使用GetFileAttributes

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

或更严格的版本(根据Szere Dyeri的评论):

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

-

答案 6 :(得分:1)

以下是众多选择之一:

HANDLE handle = FindFirstFile(lpszFilename);
if (handle == INVALID_HANDLE_VALUE) 
    return false;
FindClose(handle);
return true;

答案 7 :(得分:1)

在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;
}

但是请记住,即使你从其中一个调用中恢复正常,当你打开它时,该文件仍然不存在。很多时候,最好只表现为文件存在,并在不存在时优雅地处理错误。

答案 8 :(得分:0)

我为此目的使用FindFirstFile / FindNextFile API函数。

答案 9 :(得分:0)

根据我的经验,_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

答案 10 :(得分:0)

这应该这样做。

#include <fstream>

bool DoesFileExist( LPWSTR lpszFilename )
{
  ifstream fin;
  fin.open(lpszFilename.c_str(), ifstream::in);
  fin.close();
  return !fin.fail();
}

答案 11 :(得分:-1)

我通常使用boost :: filesystem。有一个exists()函数。 :)

相关问题