我经常使用像File.Exists
这样的库函数来检查文件的存在,然后再打开文件或执行其他操作。虽然多年来我在实践中对此有好运,但我想知道它是否是一个考虑不周的模式。
任何IO调用(如文件系统读取)都可能由于多种原因而失败。路径字符串可能是错误的或文件实际上不存在,您可能缺少权限,其他人可能有阻止您的锁。您甚至可以让网络上的其他进程或其他用户在File.Exists
和您的Open
之间以毫秒为单位移动文件。
即使您从File.Exists
获得了成功的结果,您仍然应该在try块中包含实际的open语句来处理其他可能的失败模式之一。如果我正确地考虑这一点,File.Exists
如果你使用它而不是Try
(因为我确信我过去偶尔会有这种情况),只会让你陷入虚假的安全感。 p>
所有这一切都让我觉得我应该放弃File.Exists
并改变我发现的任何现有代码,只使用Try ... Catch模式。这是一个明智的结论吗?我意识到框架是作者,但我们可以使用它,但这并不能自动使它成为实践中的好工具。
答案 0 :(得分:4)
我认为答案完全取决于您使用File.Exists的具体原因。
例如,如果您要检查文件到达的某个文件路径,File.Exists可能很容易成为合适的方法,因为您不关心不存在的原因是什么。
但是,如果您正在处理最终用户请求的文件(即请导入此excel文件),您将需要确切知道文件失败的原因。在这个特定的实例中,File.Exists不是一个正确的方法,因为文件的存在可能会在您检查它和打开文件的时间之间发生变化。在这种情况下,我们尝试打开文件并在处理之前获取锁定。 open方法将抛出适合您正在处理的特定方案的错误,以便您可以向用户提供有关问题的更准确信息(即,另一个进程已锁定文件,网络文件不可用等)。
答案 1 :(得分:3)
对于任何可以合理抛出异常并且任何I / O操作属于该类别的代码,您都应该绝对实现异常处理程序。
但这并不意味着使用File.Exists
是错误的。如果文件可能不存在的合理可能性,则预防比治愈更有效。如果该文件绝对应该存在,那么总体上可能会遇到偶然的异常,而不是每次都先进行检查。
答案 2 :(得分:3)
我在正常操作条件下存在可能的情况下使用File.Exists
(在我的系统中没有出现任何问题)。如果我知道文件应该存在(除非我的系统坏了),那么我不使用File.Exist
。
我不会称之为“模式”。最好的模式是根据具体情况考虑你在做什么。
答案 3 :(得分:0)
由您决定如何处理未找到的文件。如果您已经使用File.Exists检查文件是否存在,或者您也可以在代码周围使用try catch块并处理FilenotFound异常,这将识别文件存在与否的天气。它纯粹取决于你,但我更愿意检查File.Exists。它与检查null以访问对象相同,而不是在代码块周围编写try catch并在catch中标识对象为null。在你最后处理这样的验证总是很好,而不是把它留给c#try catch块。