我的 finally 子句中有一个File.Delete
像这样的:
finally
{
//remove the temporary file
if(File.Exists(transformedFile))
File.Delete(transformedFile);
}
根据C# 文档,对不存在的文件调用 File.Delete 不会引发任何异常。
是否可以删除File.Exists
包装,或者这会使我面临可能的其他异常?
如果你需要它,它是不够的,因为文件可以在你确认它存在后被删除。在这种情况下,最佳做法是简单地尝试删除文件。如果它因“找不到文件”类型的错误而失败,那么您将知道该文件不存在。这消除了额外的操作并避免了任何类型的竞争窗口。
在一种情况下,Exists
之前检查Delete
可以防止异常。如果您的文件名具有无效路径,则该Exists
方法返回false
.
那么这取决于你想要什么行为。在某些情况下,无效路径会导致异常。
此外,仅仅因为文件存在并不意味着总是可以删除它(当时)。对于不可预见的问题,您仍然需要异常处理。
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();
您仍然可以获得其他类型的异常。例如 IOException 如果文件正在使用中。
因此,如果您坚持在finally块中删除文件并希望确保不会出现异常,只需在 File.delete 周围放置另一个 try-catch。
finally
{
try
{
//remove the temporary file
File.Delete(transformedFile);
}
catch
{
}
}
但是如果您的目标是在任何情况下删除文件,我认为如果您专门打开文件会是个好主意,在这种情况下您应该先关闭文件然后删除它。
让我们从逻辑上和批判性地看待这个问题。假设 MSDN doco 不是 100% 准确(它确实包含偶尔的错误)并且可能引发FileNotFoundException ,它可能由以下任一原因引起:
该文件从不存在(您在创建文件之前退出try
并进入)finally
您有一个程序错误(您错误地组装了文件路径或名称)
有人会假设选项#2不应该发生,因为您对此进行了测试,如果它仍然可以发生,那么您的代码很臭。这使得选项 #1 作为唯一可行的选项,在这种情况下,您不关心异常,因此您只需抓住它并继续前进。这意味着即使可以抛出FileNotFoundException ,您的具体问题也基本上是多余的。
但是...
我仍然会使用 try/catch 包装 File.Delete,因为 IMVHO 仍然存在两个可能的异常,您需要注意:IOException和UnauthorizedAccessException。如果其中任何一种发生,您应该查看某种缓解措施(可能设置文件以在下次重新启动时删除和/或以某种方式通知用户)。
我之前问过这个问题的类似问题,我得出了这个结论:
这取决于. 是的,我知道......这不是一个直接的答案,但这里有一些注意事项可以确定您的情况是否需要文件存在检查和/或方法try { ... } catch { ... }
周围的块File.Delete(...)
。