这适用于仅限 Windows 的程序,因此可移植代码不是问题。
我只需要:
bool DoesFileExist( LPWSTR lpszFilename )
{
// ...
}
根据可敬的 Raymond Chen 的说法,如果你迷信,你应该 使用 GetFileAttributes。
这是一个有点复杂的问题。没有 100% 的方法来检查文件是否存在。您所能检查的只是“我可以某种程度访问的文件是否存在”。对于非超级用户帐户,很可能存在您无权访问的文件,访问检查不会显示文件的存在情况。
例如。可能无法访问特定目录。那么无法确定该目录中是否存在文件。
话虽如此,如果您想检查文件是否存在,您可以使用以下之一进行访问:_stat、_stat64、_stati64、_wstat、_wstat64、_wstati64
GetFileAttributes 就是您要寻找的。如果它返回的值不是 INVALID_FILE_ATTRIBUTES,则该文件存在。
打开它。您无法可靠地测试文件是否存在于多任务操作系统上。当您打开它时,您可以确保它不会消失。
仅限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 ) );
}
–
在 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,当您打开该文件时,该文件仍然可能不存在。很多时候,最好的表现就好像文件存在一样,并在文件不存在时优雅地处理错误。
这是众多选项之一:
HANDLE handle = FindFirstFile(lpszFilename);
if (handle == INVALID_HANDLE_VALUE)
return false;
FindClose(handle);
return true;
我使用 FindFirstFile / FindNextFile API 函数来实现此目的。
根据我的经验,_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
这应该可以。
#include <fstream>
bool DoesFileExist( LPWSTR lpszFilename )
{
ifstream fin;
fin.open(lpszFilename.c_str(), ifstream::in);
fin.close();
return !fin.fail();
}
我通常使用 boost::filesystem。有一个exists()函数。 :)