【发布时间】:2009-03-23 14:46:30
【问题描述】:
文件系统是易变的。这意味着您不能相信一个操作的结果对于下一个操作仍然有效,即使它是下一行代码。你不能只说if (some file exists and I have permissions for it) open the file,也不能说if (some file does not exist) create the file。 if 条件的结果总是有可能在代码的两部分之间更改。操作是不同的:不是原子的。
更糟糕的是,问题的性质意味着,如果您想进行此检查,您很可能已经担心或意识到文件可能会发生您无法控制的事情。开发环境的性质使此事件在您的测试期间不太可能发生并且非常难以重现。因此,您不仅有错误,而且错误不会在测试时出现。
因此,在正常情况下,最好的做法是不要尝试检查文件或目录是否存在。相反,请将您的开发时间用于处理来自文件系统的异常。无论如何,您必须处理这些异常,因此这是对资源的更好利用。尽管异常很慢,但检查文件是否存在需要额外访问磁盘,并且磁盘访问速度要慢得多。在另一个问题中,我什至有一个投票良好的answer。
但我有一些疑问。例如,在 .Net 中,如果确实总是正确,那么 .Exists() 方法一开始就不会出现在 API 中。还要考虑您期望程序需要创建文件的场景。想到的第一个例子是桌面应用程序。此应用程序将默认用户配置文件安装到它的主目录,并且每个用户第一次启动应用程序时,它会将这个文件复制到该用户的应用程序数据文件夹。它希望该文件在第一次启动时不存在。
那么,什么时候可以提前检查文件是否存在(或其他属性,如大小和权限)?在第一次尝试时期待失败而不是成功是一个足够好的经验法则吗?
【问题讨论】:
标签: language-agnostic filesystems