语言无关 – 什么时候可以检查文件是否存在?

文件系统是不稳定的。这意味着您不能相信一个操作的结果仍然对下一个操作有效,即使它是下一行代码。你不能只说如果(一些文件存在,我有它的权限)打开文件,你不能说如果(一些文件不存在)创建文件。总是有可能你的if条件的结果会在代码的两个部分之间改变。操作是不同的:不是原子的。

更糟的是,问题的本质意味着,如果你试图进行这种检查,赔率是你已经担心或意识到,你不能控制的东西可能发生在文件。开发环境的本质使得此事件在测试期间不太可能发生,并且非常难以重现。所以,不仅你有一个错误,但该错误不会显示,而测试。

因此,在正常情况下,最好的做法是不要尝试检查文件或目录是否存在。相反,将您的开发时间用于处理来自文件系统的异常。你必须处理这些异常,所以这是一个更好地利用你的资源。即使异常很慢,检查文件的存在也需要额外的磁盘访问,磁盘访问速度要慢得多。我在另一个问题上甚至有一个良好投票的answer这个效果。

但我有一些疑问。在.Net中,例如,如果这真的总是真的,.Exists()方法不会在API中首先。还要考虑您希望程序需要创建文件的情况。想到的第一个例子是桌面应用程序。此应用程序将默认用户配置文件安装到其主目录,并且第一次每个用户启动应用程序时,它将该文件复制到该用户的应用程序数据文件夹。它期望该文件在第一次启动时不存在。

因此,何时可以提前检查文件的存在(或其他属性,如大小和权限)?期望失败而不是成功在第一次尝试一个足够好的经验法则?

当您不打算打开文件时,File.Exists方法主要用于测试文件的存在。例如测试一个锁定文件的存在,它的存在告诉你一些东西,但它的内容是无关紧要的。

如果你要打开文件,那么你将需要处理任何异常,而不管先前调用File.Exists的结果如何。所以,一般来说,在这些情况下调用它没有真正的价值。只需在打开的方法中使用相应的FileMode枚举值,并处理任何异常,就像这样简单。

编辑:尽管这是根据.Net API,它是基于底层系统API。 Windows和Unix都有使用等价于FileMode枚举的系统调用(即CreateFile)。实际上在.Net(或Mono)中,FileMode的值只是传递给底层的系统调用。

http://stackoverflow.com/questions/673654/when-is-it-okay-to-check-if-a-file-exists

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:语言无关 – 什么时候可以检查文件是否存在?