.net 在C#中,如何检查File.Delete()是否会成功而不尝试?

u5i3ibmn  于 2022-12-05  发布在  .NET
关注(0)|答案(7)|浏览(161)

在C#中,System.IO.File.Delete(filePath)要么删除指定的文件,要么引发异常。如果当前用户没有删除文件的权限,它将引发UnauthorizedAccessException。
是否有某种方法可以提前判断删除操作是否可能抛出UnauthorizedAccessException(即,查询ACL以查看当前线程的标识是否具有删除指定文件的权限?)
我基本上是在寻找:

if (FileIsDeletableByCurrentUser(filePath)) {
    /* remove supporting database records, etc. here */
    File.Delete(filePath);
}

但是我不知道如何实现FileIsDeletableByCurrentUser()。

ac1kyiln

ac1kyiln1#

实现FileIsDeletableByCurrentUser的问题是不可能实现,原因是文件系统是一个不断变化的项目。
在您对文件系统所做的任何检查和下一个操作之间,可能会发生任何数量的事件。包括...

  • 文件的权限可能会更改
  • 可以删除该文件
  • 文件可能被其他用户/进程锁定
  • 可以移除文件所在的USB密钥

你能写的最好的函数应该命名为FileWasDeletableByCurrentUser

yptwkmov

yptwkmov2#

您是否尝试过System.IO.File.GetAccessControl(filename),它应该返回一个FileSecurity,其中包含有关该文件权限的信息。

0mkxixxg

0mkxixxg3#

严格地说,一个UnauthorizedAccessException意味着该路径是一个目录,所以你可以使用一个System.IO.Path.getFileName(path)类型的命令并捕获该参数异常。
但是,如果您想要一个更全面的解决方案,请使用Dale Halliwell提到的System.IO.File.GetAccessControl

u7up0aaq

u7up0aaq4#

如上所述。查找文件权限并与运行应用程序的用户进行比较。
您也可以随时使用此方法

bool deletemyfile()  
{  
    try  
    {  
        ...delete my file  
        return true;  
    }  
    catch  
    {  
        return false;  
    }  
}

如果它返回false,你知道它失败了,如果它返回true,那么..它工作,文件不见了。不知道你到底在追求什么,但这是我能想到的最好的

nmpmafwu

nmpmafwu5#

当然,您可以使用System.IO检查ReadOnly标志,也可以结合当前用户检查文件上的ACL安全性,但就像Mehrdad在他的评论中所写的那样,它永远不会在所有情况下都是完全证明的。因此,您需要随时对异常情况进行异常处理(即使它只是一个顶级的捕获,它记录/显示一个“意外问题”并杀死您的应用程序)。

qzlgjiam

qzlgjiam6#

您应该获得该文件的访问控制列表(ACL)。
但这并不一定意味着您实际上可以删除它,因为仍然可以设置只读标志或其他程序已锁定该文件。

sczxawaw

sczxawaw7#

似乎按照以下顺序做事会更容易:
1.获取所需的有关文件的任何信息,以便执行其他操作(删除数据库数据等)
1.尝试删除该文件
1.如果成功删除文件,则执行剩余的“清理”工作。如果未成功删除,则返回/处理异常等。

相关问题