2011-10-17 20 views
1

在win32 C++;有沒有辦法確定文件夾/文件是否可訪問?您知道如果您嘗試訪問C:/ Windows目錄&中的某個文件夾,您將看到一個彈出窗口,顯示「該文件夾無法訪問」。WinAPI方式確定文件是否可訪問/私有

也許有一個文件屬性常量,表示該文件是私人的?也許像FILE_ATTRIBUTE_PRIVATE?

WIN32_FIND_DATA dirData; 

while (FindNextFile(dir, &dirData) != 0) 
{ 
    // I made the following constant up 
    if (!(fileData.dwFileAttributes & FILE_ATTRIBUTE_PRIVATE)) 
    { 
     // file is accessible so store filepath 
     files.push_back(fileData.cFileName); 
    } 
    else // file is not accessible so dont store 
} 

或者是會知道的唯一途徑:

dir = FindFirstFileEx((LPCTSTR)directory.c_str(), FindExInfoStandard, &dirData, FindExSearchNameMatch, NULL, 0); 

if (dir == ???) { the file is inaccessible } [/code] 

回答

2

這不會是文件本身的標誌,因爲不同的帳戶可以訪問不同的文件/目錄。相反,windows使用ACL(訪問控制列表),這是確定誰有權訪問什麼的數據結構。

windows中的ACL可以用於處理引用的任何內容(文件,目錄,進程,互斥體,命名管道......)。您可以通過轉到文件的屬性並查看「安全性」選項卡來查看文件ACL。

因此,在您的應用程序中,您並不是真的想要檢查標誌,而是要將文件的ACL與運行應用程序的用戶帳戶進行比較。檢出AccessCheck Win32函數。我認爲這正是你正在尋找的。個人而言,我從來沒有使用過這個功能,但是如果您正在尋找Win32解決方案並且想要一個函數調用,那可能是您最好的選擇。但是,正如其他人指出的那樣,這可能太複雜了。我一直使用_access(或_waccess),它是CRT的一部分,非常易於使用,並且不會僅僅通過獲取文件句柄來關閉它(取決於您的循環是多麼緊密,這些調用實際上可以加起來)。

+2

是,'AccessCheck'會的工作,但它的複雜和棘手的使用。如果您想知道您是否可以打開文件,最簡單的方法就是嘗試打開文件並查看是否成功。 –

+0

是啊,我從來沒有使用過它,但是OP正在尋找win32調用:)使用另一種替代方法更新了該文章 – DXM

+0

僅獲取文件句柄才能關閉它?不,你應該使用文件句柄來做一些有用的事情。如果你不打算使用資源,爲什麼它的權限很重要? –

7

最好的事情就是嘗試訪問它。

您可以計算訪問控制列表爲特定用戶帳戶授予的訪問權限,但這非常複雜,訪問檢查後權限可能會更改。所以只需打開文件並處理拒絕訪問錯誤。

+1

「訪問被拒絕」意味着'GetLastError()== 5'。 – MSalters

相關問題