文件存在是否被认为是有害的

本文关键字:认为是 存在 是否 文件 | 更新日期: 2023-09-27 18:25:04

我经常使用像File.Exists这样的库函数在打开文件或执行其他操作之前检查文件是否存在。 虽然多年来我在实践中运气很好,但我想知道这是否是一个考虑不周的模式。

任何 IO 调用(如文件系统读取(都可能由于多种原因而失败。路径字符串可能是错误的,或者文件实际上不存在,您可能缺少权限,其他人可能有阻止您的锁。您甚至可以让网络上的另一个进程或其他用户在您的File.ExistsOpen之间的毫秒内移动文件。

即使你从File.Exists中得到了一个成功的结果,你仍然应该将你的实际打开语句包含在一个try块中,以处理其他可能的失败模式之一。 如果我考虑正确,如果你使用它而不是TryFile.Exists只会让你陷入一种虚假的安全感(正如我确信我过去偶尔会这样做的那样(。

所有这些听起来我应该放弃File.Exists并更改我找到的任何现有代码以使用 Try...仅捕获模式。 这是一个明智的结论吗?我意识到框架作者,但它在那里供我们使用,但这并不能自动使其成为实践中的好工具。

文件存在是否被认为是有害的

我认为答案完全取决于您使用File.Exists的具体原因。

例如,如果您正在检查某个文件路径是否有文件到达,File.Exists 很容易成为合适的方法,因为您不在乎不存在的原因是什么。

但是,如果您正在处理最终用户请求的文件(即请导入此 excel 文件(,您将想知道该文件失败的确切原因。在此特定实例中,File.Exists 不是完全正确的方法,因为文件存在可能会在您检查它和打开文件之间发生变化。在这种情况下,我们尝试打开文件并在处理文件之前锁定它。open 方法将抛出适合您正在处理的特定场景的错误,以便您可以为用户提供有关问题的更准确信息(即另一个进程锁定了文件、网络文件不可用等(。

绝对应该为任何可以合理引发异常且任何 I/O 操作都属于该类别的代码实现异常处理程序。

这并不意味着使用File.Exists是错误的。 如果存在该文件可能不存在的合理可能性,那么预防比治疗更有效。 但是,如果文件绝对应该存在,那么遭受偶尔的异常而不是每次都先检查可能会更高性能。

我在正常操作条件下文件可能不存在的情况下使用File.Exists(我的系统中没有损坏某些东西(。如果我知道该文件应该存在(除非我的系统坏了(,那么我不使用 File.Exist .

不过,我不会称之为"模式"。最好的模式是根据具体情况考虑你正在做什么。

这取决于

您希望如何处理未找到的文件。如果您使用File.Exist来检查文件是否存在,或者您也可以在代码周围使用try捕获块并处理FilenotFound异常,这将确定文件是否存在。这完全取决于您,但我更愿意检查File.Exists。这就像检查 null 以获取对象,而不是在您的代码块周围编写 try catch 并在 catch 中识别您的对象为 null 一样。在你这边处理这样的验证总是好的,而不是把它留给 c# try catch 块。