簡體   English   中英

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

[英]How do I check whether a file exists in C++ for a Windows program?

這適用於僅限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 ) );
}

-

以下是眾多選擇之一:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM