我应该在调用File.Delete之前调用File.Exists吗?

时间:2013-01-19 01:05:09

标签: c# file exception io

我的finally子句中有一个File.Delete,如下所示:

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

根据C# documentation,在不存在的文件上调用File.Delete不会抛出任何异常。

是否可以移除File.Exists包装,或者是否会让我接触到其他可能的例外情况?

6 个答案:

答案 0 :(得分:11)

如果您需要它,它是不够的,因为在您确认它存在后可以删除该文件。在这种情况下,最佳做法是简单地尝试删除该文件。如果失败并显示“找不到文件”类型的错误,那么您将知道该文件不存在。这将删除一个额外的操作,并避免任何种类的竞赛窗口。

答案 1 :(得分:9)

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

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

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

答案 2 :(得分:4)

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 File.Delete

答案 3 :(得分:1)

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

  1. 该文件从未存在(您退出try并在创建文件之前输入了finally

  2. 您遇到程序错误(您已经错误地汇编了文件路径或名称)

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

    <强>然而...
    我仍然会使用try / catch包装File.Delete,因为IMVHO仍有两个可能的例外,您需要注意:IOExceptionUnauthorizedAccessException。如果出现其中任何一种情况,您应该查看某种缓解措施(可能会在下次重新启动时将文件设置为删除和/或以某种方式通知用户)。

答案 4 :(得分:1)

你仍然可以获得其他类型的例外。例如,如果使用了文件,则为IOException。

所以,如果你坚持删除 finally 块中的文件,并且想要确保不会出现异常,只需在File.delete周围添加另一个try-catch。

finally
{
   try 
   {
     //remove the temporary file
     File.Delete(transformedFile);
   }
   catch
   {
   }
}

但如果您的目标是在任何情况下删除文件,我认为如果您专门打开文件将是个好主意,在这种情况下,您应首先关闭文件,然后删除< / strong>它。

答案 5 :(得分:0)

之前我曾问a similar question这个问题,我得出了这个结论:

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

  • 您的代码是否生成了该文件?如果是这样,您实际上不需要检查该文件是否存在。
  • 您是否关心处理其他问题?请记住,您正在使用文件系统,并且MSDN文档清楚地向您显示该方法可能由于其他情况而生成异常。