调试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服务生成的,请打开“服务”,在列表中找到您的服务并双击它。在“登录”选项卡上,确保您的服务配置为具有导致异常的资源访问权限的用户。作为网络服务运行的服务对本地资源的访问非常有限。我建议您与系统管理员聊天,以确定是要与默认服务用户一起使用,还是创建具有自定义权限的自定义服务用户。

猜你喜欢

转载自www.cnblogs.com/yilang/p/12585708.html
今日推荐