調試System.UnauthorizedAccessException(通常后跟:拒絕訪問路徑)


今天,我要向您介紹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服務生成的,請打開“服務”,在列表中找到您的服務並雙擊它。在“登錄”選項卡上,確保您的服務配置為具有導致異常的資源訪問權限的用戶。作為網絡服務運行的服務對本地資源的訪問非常有限。我建議您與系統管理員聊天,以確定是要與默認服務用戶一起使用,還是創建具有自定義權限的自定義服務用戶。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM