2010-11-19 64 views
1

之前寫入文件:文件訪問問題

using (StreamWriter outfile = new StreamWriter(filePath, false, System.Text.Encoding.UTF8)) 
{ 
    outfile.Write(content);    
} 

我檢查文件寫入accsses使用此:

public bool CheckIfAccessToFileIsGranted(string filePath) 
{ 
    try 
    { 
     new FileIOPermission(FileIOPermissionAccess.Write, filePath).Demand(); 
     return true; 
    } 
    catch (SecurityException) 
    { 
     return false; 
    } 
} 

儘管有上述功能的事實給予我的評價(返回true) ,我在打開流時遇到了UnauthorizedAccessException。爲什麼?

問候

回答

6

這裏的問題是你使用文件系統權限混亂的代碼訪問安全(CAS)。前者是一種限制,僅適用於CLR流程,而後者則是操作系統級限制。這兩種安全方法是相互獨立的(儘管文件系統信息可以對CAS策略做出貢獻)。

在這種情況下,UnauthorizedAcessException表示文件系統中缺少權限,但您試圖用CAS檢查來防止這種情況,這將不起作用。

在文件系統級別(不包括CAS),嘗試驗證操作的操作將會或不會成功執行,這實際上是徒勞的。根本沒有辦法做到這一點,因爲有太多的外部實體可以在檢查之間更改文件系統並嘗試訪問。只要嘗試訪問文件並捕獲由於訪問失敗而導致的異常就更加可靠。

下面就來詳細的博客文章中,我在這個問題上

+1

+1只爲最後一句話... – 2010-11-19 18:19:29

4

寫道只是不這樣做的鏈接。儘管JaredPar對於這種情況不起作用的正確答案,但我想擴展他的最後一句話:整個練習是徒勞的。

文件系統權限爲易失性。它們可以以完全獨立於應用程序代碼的方式從一時變爲另一時刻,這包括您在檢查權限和嘗試寫入文件之間的時間。雖然權限不會經常更改,但在此關鍵時期內甚至可以刪除或重命名文件。

問題是,雖然很小,但在這個小窗口中發生的事情的可能性足夠高,您需要花時間爲此代碼構建一個好的異常處理程序。一旦你完成了這些,你所做的所有這些工作,檢查文件權限突然變得沒有意義。

換句話說,查看您是否有權寫入文件的正確方法是實際嘗試寫入文件。