我要打电话给档案吗?在调用File.Delete之前已存在

本文关键字:Delete File 存在 调用 打电话 档案 我要 | 更新日期: 2023-09-27 17:54:15

我有一个File.Delete在我的最后子句,像这样:

finally
{
    //remove the temporary file
    if(File.Exists(transformedFile))
        File.Delete(transformedFile);
}

根据c#文档,调用File。对不存在的文件进行删除不会引发任何异常。

删除File.Exists包装是可以的,还是会使我暴露于可能的其他异常?

我要打电话给档案吗?在调用File.Delete之前已存在

如果您需要它,它是不够的,因为文件可以在您确认它存在后被删除。在这种情况下,最佳实践是尝试删除该文件。如果它失败并显示"file not found"类型的错误,那么您将知道该文件不存在。这将删除一个额外的操作,并避免任何类型的竞争窗口。

有一种情况,在Delete之前检查Exists可以防止异常。如果文件名的路径无效,则Exists方法返回false

这取决于你想要什么行为。在某些情况下,无效路径应该导致异常。

同样,仅仅因为文件存在并不意味着总是可以删除它(当时)。对于不可预见的问题,您仍然需要异常处理。

File.Delete不抛出FileNotFoundException,它不关心。只有当路径无效时,它才会抛出异常,因为它有不存在的目录,在这种情况下,它会抛出DirectoryNotFoundException

此代码不会抛出任何异常。

var file = new FileInfo(@"C:'doesnotexist.file11111");
file.Delete();

这将抛出DirectoryNotFoundException

var file = new FileInfo(@"C:'bad.dir'doesnotexist.file11111");
file.Delete();

MSDN文件。删除

让我们从逻辑和批判性的角度来看待这个问题。假设MSDN文档不是100%准确(它确实包含偶尔的错误),并且可能会抛出FileNotFoundException ,它将由以下两种原因引起:

  1. 文件一开始就不存在(在创建文件之前退出try并进入finally)

  2. 你有一个程序错误(你组装的文件路径或名称不正确)

人们会认为选项#2不应该发生,因为你测试了它,如果它仍然可能发生,那么你的代码就有问题了。这使得选项#1成为唯一可行的选项,在这种情况下,您不关心异常,因此您只需捕获它并继续前进。这意味着你的特定问题在很大程度上是多余的,即使FileNotFoundException可能被抛出。

然而…


我仍然会包装文件。用try/catch删除,因为IMVHO仍然有两个可能的异常,您需要注意:IOException和UnauthorizedAccessException。如果出现上述任何一种情况,您应该考虑采取某种缓解措施(可能在下次重新启动时设置删除文件和/或以某种方式通知用户)。

你仍然可以得到其他类型的异常。

所以如果你坚持删除finally块中的文件,并且想要确保不会出现异常,只需在file .delete.

周围添加另一个try-catch即可。
finally
{
   try 
   {
     //remove the temporary file
     File.Delete(transformedFile);
   }
   catch
   {
   }
}

但是如果你的目标是在任何情况下删除文件,我认为最好只打开文件,在这种情况下,你应该先关闭文件,然后删除

我以前问过一个类似的问题,我得出了这样的结论:

<我> 。是的,我知道……这不是一个直接的答案,但这里有一些注意事项,以确定您的情况是否需要一个文件存在检查和/或File.Delete(...)方法周围的try { ... } catch { ... }块。

    你的代码生成文件了吗?如果是,就不需要检查文件是否存在了。
  • 你关心处理其他问题吗?请记住,您正在使用文件系统,MSDN文档清楚地告诉您,该方法可能会由于其他情况而产生异常。