在C#中,System.IO.File.Delete(文件路径),要么删除指定的文件,或引发异常。 如果当前用户没有权限删除这个文件,它会引发一个UnauthorizedAccessException。
有没有一些方法,我可以提前告诉是否删除可能引发UnauthorizedAccessException与否(即查询ACL看到当前线程的身份是否有权限删除指定文件?)
基本上,我希望做的:
if (FileIsDeletableByCurrentUser(filePath)) {
/* remove supporting database records, etc. here */
File.Delete(filePath);
}
但我不知道如何实现FileIsDeletableByCurrentUser()。
看看这篇文章- http://www.codeproject.com/KB/files/UserFileAccessRights.aspx
与实施问题FileIsDeletableByCurrentUser
是,它不可能这样做。 原因是文件系统是一个不断变化的项目。
在任何一次检查之间您对文件系统的下一个操作的任何数量的事件能够而且将会发生。 包含 ...
- 该文件的权限可能会改变
- 该文件可能被删除
- 该文件可能被其他用户/进程被锁定
- USB密钥的文件上可以去掉
你可以写的最好的功能将最贴切地命名为FileWasDeletableByCurrentUser
。
你试过System.IO.File.GetAccessControl(文件名)应该返回FileSecurity有关该文件的权限信息。
严格地说,一个UnauthorizedAccessException意味着该路径是一个目录,所以你可以使用一个System.IO.Path.GetFileName(路径)键入命令和捕捉参数异常。
但是,如果你想有一个更全面的解决方案,使用System.IO.File.GetAccessControl由戴尔·哈利韦尔提到
如上所述。 查找文件的权限,并与谁正在运行的应用程序的用户进行比较。
你总是可以用这个形式给出,以及
bool deletemyfile()
{
try
{
...delete my file
return true;
}
catch
{
return false;
}
}
如果返回false,你知道它失败了,如果它返回true,则..它的工作和文件不见了。 不知道你究竟是什么后,但是这是我能想到的最好的
当然,你可以使用System.IO检查只读标志,可能ACL与当前用户合并太文件的安全性,但像迈赫达德在他的评论中写道:它永远不会是完全的证明在所有情况下。 所以,你需要异常处理在所有时间的特殊情况(即使它只是一个顶级包罗万象的 ,即记录/显示了一个“意外问题”,并杀死你的应用程序)。
你应该得到该文件的访问控制列表(ACL)。
但是,这并不一定意味着你实际上可以删除它,因为只读标志仍可设置或其他程序已锁定该文件。
文章来源: How do I check whether File.Delete() will succeed without trying it, in C#?