11

我的 finally 子句中有一个File.Delete像这样的:

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

根据C# 文档,对不存在的文件调用 File.Delete 不会引发任何异常。

是否可以删除File.Exists包装,或者这会使我面临可能的其他异常?

4

6 回答 6

14

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

于 2013-01-19T01:07:11.593 回答
10

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

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

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

于 2013-01-19T01:08:33.660 回答
5

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

此代码不会引发任何异常。

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

这会抛出DirectoryNotFoundException

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

MSDN 文件.删除

于 2015-11-11T19:09:09.933 回答
1

您仍然可以获得其他类型的异常。例如 IOException 如果文件正在使用中。

因此,如果您坚持finally块中删除文件并希望确保不会出现异常,只需在 File.delete 周围放置另一个 try-catch。

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

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

于 2013-01-19T01:47:28.287 回答
1

让我们从逻辑上和批判性地看待这个问题。假设 MSDN doco 不是 100% 准确(它确实包含偶尔的错误)并且可能引发FileNotFoundException ,它可能由以下任一原因引起:

  1. 该文件从不存在(您在创建文件之前退出try并进入)finally

  2. 您有一个程序错误(您错误地组装了文件路径或名称)

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

但是...
我仍然会使用 try/catch 包装 File.Delete,因为 IMVHO 仍然存在两个可能的异常,您需要注意:IOExceptionUnauthorizedAccessException。如果其中任何一种发生,您应该查看某种缓解措施(可能设置文件以在下次重新启动时删除和/或以某种方式通知用户)。

于 2013-01-19T01:21:37.690 回答
0

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

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

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