在C#中,System.IO.File.Delete(filePath)要么删除指定的文件,要么引发异常。如果当前用户没有删除文件的权限,它将引发UnauthorizedAccessException。
是否有某种方法可以提前判断删除操作是否可能抛出UnauthorizedAccessException(即,查询ACL以查看当前线程的标识是否具有删除指定文件的权限?)
我基本上是在寻找:
if (FileIsDeletableByCurrentUser(filePath)) {
/* remove supporting database records, etc. here */
File.Delete(filePath);
}
但是我不知道如何实现FileIsDeletableByCurrentUser()。
7条答案
按热度按时间ac1kyiln1#
实现
FileIsDeletableByCurrentUser
的问题是不可能实现,原因是文件系统是一个不断变化的项目。在您对文件系统所做的任何检查和下一个操作之间,可能会发生任何数量的事件。包括...
你能写的最好的函数应该命名为
FileWasDeletableByCurrentUser
。yptwkmov2#
您是否尝试过System.IO.File.GetAccessControl(filename),它应该返回一个FileSecurity,其中包含有关该文件权限的信息。
0mkxixxg3#
严格地说,一个UnauthorizedAccessException意味着该路径是一个目录,所以你可以使用一个System.IO.Path.getFileName(path)类型的命令并捕获该参数异常。
但是,如果您想要一个更全面的解决方案,请使用Dale Halliwell提到的System.IO.File.GetAccessControl
u7up0aaq4#
如上所述。查找文件权限并与运行应用程序的用户进行比较。
您也可以随时使用此方法
如果它返回false,你知道它失败了,如果它返回true,那么..它工作,文件不见了。不知道你到底在追求什么,但这是我能想到的最好的
nmpmafwu5#
当然,您可以使用System.IO检查ReadOnly标志,也可以结合当前用户检查文件上的ACL安全性,但就像Mehrdad在他的评论中所写的那样,它永远不会在所有情况下都是完全证明的。因此,您需要随时对异常情况进行异常处理(即使它只是一个顶级的捕获,它记录/显示一个“意外问题”并杀死您的应用程序)。
qzlgjiam6#
您应该获得该文件的访问控制列表(ACL)。
但这并不一定意味着您实际上可以删除它,因为仍然可以设置只读标志或其他程序已锁定该文件。
sczxawaw7#
似乎按照以下顺序做事会更容易:
1.获取所需的有关文件的任何信息,以便执行其他操作(删除数据库数据等)
1.尝试删除该文件
1.如果成功删除文件,则执行剩余的“清理”工作。如果未成功删除,则返回/处理异常等。