我的finally子句中有一个File.Delete
,如下所示:
finally
{
//remove the temporary file
if(File.Exists(transformedFile))
File.Delete(transformedFile);
}
根据C#文档,调用File.Delete删除不存在的文件不会引发任何异常。删除
File.Exists
包装是否安全,是否可能导致额外的异常?我的finally子句中有一个File.Delete
,如下所示:
finally
{
//remove the temporary file
if(File.Exists(transformedFile))
File.Delete(transformedFile);
}
根据C#文档,调用File.Delete删除不存在的文件不会引发任何异常。File.Exists
包装是否安全,是否可能导致额外的异常?有一种情况,在执行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();
finally
{
try
{
//remove the temporary file
File.Delete(transformedFile);
}
catch
{
}
}
但是如果您的目标是无论如何都要删除文件,我认为最好的方法是独占式地打开文件,在这种情况下,您应该先关闭文件,然后再删除它。
让我们逻辑和批判性地看待这个问题。假设 MSDN 文档不是 100% 准确的(它确实包含偶尔出现的错误),并且可能会抛出 FileNotFoundException 异常,那么它可能是由以下原因之一导致的:
文件根本不存在(您在创建文件之前退出了 try
并进入了 finally
)
您存在编程错误(您已经错误地组装了文件路径或名称)
人们会认为选项 #2 不应该发生,因为您已经进行了测试,如果它仍然可以发生,则说明您的代码有问题。这意味着选项 #1 是唯一可行的选择,如果是这种情况,您不需要关心异常,因此只需捕获它并继续执行即可。即使可能会抛出 FileNotFoundException 异常,这意味着您的具体问题在很大程度上是多余的。
然而...
我仍然会在File.Delete周围加上try/catch,因为在我看来仍然有两种可能的异常需要注意:IOException和UnauthorizedAccessException。如果其中任何一种发生,您应该考虑采取某种缓解措施(也许是设置文件在下次重启时删除和/或以某种方式通知用户)。
我之前曾经问过一个类似的问题,并得出了以下结论:
这取决于具体情况。是的,我知道...这不是一个直截了当的答案,但以下是一些需要注意的事项,以确定您的情况是否需要进行文件存在检查和/或在File.Delete(...)
方法周围使用try { ... } catch { ... }
块。