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

问题描述 投票:0回答:12

这适用于仅限 Windows 的程序,因此可移植代码不是问题。

我只需要:

bool DoesFileExist( LPWSTR lpszFilename )
{
    // ...
}
c c++ windows winapi filesystems
12个回答
14
投票

根据可敬的 Raymond Chen 的说法,如果你迷信,你应该 使用 GetFileAttributes



7
投票

这是一个有点复杂的问题。没有 100% 的方法来检查文件是否存在。您所能检查的只是“我可以某种程度访问的文件是否存在”。对于非超级用户帐户,很可能存在您无权访问的文件,访问检查不会显示文件的存在情况。

例如。可能无法访问特定目录。那么无法确定该目录中是否存在文件。

话虽如此,如果您想检查文件是否存在,您可以使用以下之一进行访问:_stat、_stat64、_stati64、_wstat、_wstat64、_wstati64


6
投票

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


4
投票

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


3
投票

仅限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 ) );
}


1
投票

在 Windows 代码中执行此操作有两种常见方法。获取文件属性和创建文件,

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

但请记住,即使您从其中一个调用中返回 true,当您打开该文件时,该文件仍然可能不存在。很多时候,最好的表现就好像文件存在一样,并在文件不存在时优雅地处理错误。


1
投票

这是众多选项之一:

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

0
投票

我使用 FindFirstFile / FindNextFile API 函数来实现此目的。


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

0
投票

这应该可以。

#include <fstream>

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

-1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.