这适用于仅限Windows的程序,因此便携式代码不是问题。
我只需要:
bool DoesFileExist( LPWSTR lpszFilename )
{
// ...
}
答案 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()函数。 :)