我有一个File.Delete
在我的最后子句,像这样:
finally
{
//remove the temporary file
if(File.Exists(transformedFile))
File.Delete(transformedFile);
}
根据c#文档,调用File。对不存在的文件进行删除不会引发任何异常。
删除File.Exists
包装是可以的,还是会使我暴露于可能的其他异常?
如果您需要它,它是不够的,因为文件可以在您确认它存在后被删除。在这种情况下,最佳实践是尝试删除该文件。如果它失败并显示"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.dirdoesnotexist.file11111");
file.Delete();
MSDN文件。删除
让我们从逻辑和批判性的角度来看待这个问题。假设MSDN文档不是100%准确(它确实包含偶尔的错误),并且可能会抛出FileNotFoundException ,它将由以下两种原因引起:
-
文件一开始就不存在(在创建文件之前退出
try
并进入finally
) -
你有一个程序错误(你组装的文件路径或名称不正确)
人们会认为选项#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文档清楚地告诉您,该方法可能会由于其他情况而产生异常。