今天,我要向您介绍System.UnauthorizedAccessException。异常通常是由IO错误引起的,但其他问题(如安全限制)也可以利用此错误。我们一起挖进去!
制造错误
捕捉异常非常简单。让我们创建一个小程序来触发和捕获此错误。在编写代码之前,我将创建一个名为c: emp eadonly.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: emp
otfound.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服务生成的,请打开“服务”,在列表中找到您的服务并双击它。在“登录”选项卡上,确保您的服务配置为具有导致异常的资源访问权限的用户。作为网络服务运行的服务对本地资源的访问非常有限。我建议您与系统管理员聊天,以确定是要与默认服务用户一起使用,还是创建具有自定义权限的自定义服务用户。