2012-01-23 52 views
4

我最近在應用程序中添加了使用GetTempPath。在代碼審查它強調的是GetTempPath的描述所包含的信息:檢查目錄的正確方法可用於編寫

應用程序應該先於任何使用文件I/O操作驗證的路徑和足夠的訪問權限存在的路徑。

現在,所有的文件訪問都被封裝在try/catch塊中,並且會有哪些系統無法訪問它自己的臨時目錄?

我最初的想法是嘗試創建目錄,如果它們不存在(通過GetFileAttributes和CreateDirectory),然後創建一個文件,寫一個字節,然後刪除該文件。雖然這會起作用,但它會產生無知 - 確實有更好的方法來檢查您是否有權訪問文件夾?

我開始尋找和發現文件屬性常量,通用訪問權限,標準訪問權限,文件訪問權限常量和GetSecurityInfo函數。所有這些似乎都創建了比創建文件更長的解決方案,並查看它是否堅持方法。

那麼使用WinAPI函數檢查您是否有寫入權限的正確方法是什麼?

回答

4

MSDN註釋有誤導性。您可能需要檢查返回的路徑是否存在(如果不存在,則創建它),但要知道是否可以在那裏寫入的唯一方法是在那裏寫入。

此外,僅僅因爲你可以寫在那裏,並不意味着你可以在那裏寫。用戶或其他程序可能會刪除東西,更改安全設置,鎖定目錄等。嘗試提前驗證是否可以寫入地點是浪費時間。只需在需要時寫下,併爲失敗做好準備。

+0

+1我同意100% –

+0

特別是當AV產品介入時遊戲發生變化。它們以安全名稱阻止臨時文件夾中的某些操作而聞名,例如,阻止可執行文件。 – Deanna

3

最好的方法是嘗試將文件寫入目錄。如果由於缺乏權限而導致書寫失敗,那麼錯誤代碼會告訴你。尋找ERROR_ACCESS_DENIED

如果您試圖以任何其他方式執行此操作,那麼您將只是複製即將運行的系統代碼。而且您很少有機會將它完美地複製到當前版本的Windows和未來版本中。

有沒有必要創建一個文件,並寫一個字節。假設您有對臨時文件夾的寫入權限,並嘗試寫入您需要的整個文件。如果你遇到失敗,那麼你最好也可以終止這個過程。如果您無法寫入臨時文件夾,那麼在繼續操作方面沒有多少意義。

+0

那麼我會複製代碼,無論如何要通過編寫文件並查看是否有訪問被拒絕的消息。我想測試一下目錄是否存在,是否可寫,如果不存在,我可以回退到默認目錄。 –

+1

不要打擾。 MSDN文檔的這一部分僅僅意味着GetTempPath API不會爲您創建目錄。這並不意味着它不存在是正常的或合理的。假設臨時文件夾在那裏並寫入它。如果失敗,則向用戶報告錯誤並放棄。考慮將工作臨時文件夾作爲軟件的先決條件。或者像這樣想,如果你的「默認目錄」不可用?你會因此而倒退嗎?你必須在某處畫線。 –

+0

我有同樣的問題。在某些時候,我需要知道我是否有權訪問某個目錄。現在我有一個可以工作的解決方案(在該目錄中創建一個隨機名稱的文件,檢查創建是否成功並刪除文件)。唯一的問題是如果目錄是隻寫的,那麼之前創建的文件不能被刪除。 –

相關問題