今天,我要向您介紹System.UnauthorizedAccessException。異常通常是由IO錯誤引起的,但其他問題(如安全限制)也可以利用此錯誤。我們一起挖進去!
制造錯誤
捕捉異常非常簡單。讓我們創建一個小程序來觸發和捕獲此錯誤。在編寫代碼之前,我將創建一個名為c:\temp\readonly.txt的文本文件。創建后,右鍵單擊文件,選擇屬性並啟用只讀復選框。這會引起意外!,文件為只讀。對於代碼:
class Program { static void Main(string[] args) { var path = "c:\\temp\\readonly.txt"; try { File.Delete(path); } catch (UnauthorizedAccessException e) { Console.WriteLine(e); } } }
如代碼所示,我們只需捕獲UnauthorizedAccessException並將其記錄到控制台。
調試這個錯誤
UnauthorizedAccessException不包含其他狀態或錯誤代碼屬性,因此您可以了解發生了什么。唯一的指示是查看消息屬性,在大多數情況下,該屬性類似於:
Access to the path 'c:\temp\notfound.txt' is denied.
那么,為什么拒絕訪問?我們可以先排除一些我見過的人們提出錯誤答案的場景:
- 如果在磁盤上找不到文件(這不會引發UnauthorizedAccessException)。
- 如果一個文件當前被另一個程序鎖定(這將引發一個IOException)。
- 如果文件被Windows阻止。
- 訪問不存在的目錄中的文件(這會引發DirectoryNotFoundException)。
只讀文件
處理文件時,最容易檢查的可能是右鍵單擊文件並檢查是否選中了只讀復選框:
只需取消選中“只讀”,然后再試一次。
如果需要,可以解鎖C中的只讀文件,然后重試:
class Program { static void Main(string[] args) { var path = "c:\\temp\\notfound.txt"; try { File.Delete(path); } catch (UnauthorizedAccessException) { FileAttributes attributes = File.GetAttributes(path); if ((attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly) { attributes &= ~FileAttributes.ReadOnly; File.SetAttributes(path, attributes); File.Delete(path); } else { throw; } } } }
當前用戶無權訪問文件
UnauthorizedAccessException的另一個實例是由用戶執行程序時出現的問題引起的。如果不以提升模式運行(在Windows中具有管理權限),則當前用戶將無法訪問各種Windows目錄,如c:\ Windows和c:\Program Files
。解決此錯誤的一個簡單方法是以管理員身份運行程序。
如果錯誤是由Windows服務生成的,請打開“服務”,在列表中找到您的服務並雙擊它。在“登錄”選項卡上,確保您的服務配置為具有導致異常的資源訪問權限的用戶。作為網絡服務運行的服務對本地資源的訪問非常有限。我建議您與系統管理員聊天,以確定是要與默認服務用戶一起使用,還是創建具有自定義權限的自定義服務用戶。