[英]How do I check whether a file exists in C++ for a Windows program?
這適用於僅限Windows的程序,因此可移植代碼不是問題。
我只需要:
bool DoesFileExist( LPWSTR lpszFilename )
{
// ...
}
據着名的Raymond Chen說, 如果你迷信的話 ,你應該使用GetFileAttributes 。
使用_access
或stat
。
這是一個復雜的問題。 沒有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 ) );
}
-
以下是眾多選擇之一:
HANDLE handle = FindFirstFile(lpszFilename);
if (handle == INVALID_HANDLE_VALUE)
return false;
FindClose(handle);
return true;
在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;
}
但請記住,即使你從其中一個調用中恢復正常,當你打開它時,該文件仍然不存在。 很多時候,最好只表現為文件存在,並在不存在時優雅地處理錯誤。
這應該做到這一點。
#include <fstream>
bool DoesFileExist( LPWSTR lpszFilename )
{
ifstream fin;
fin.open(lpszFilename.c_str(), ifstream::in);
fin.close();
return !fin.fail();
}
為此,我使用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
我通常使用boost :: filesystem。 有一個exists()函數。 :)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.