何时适合调用fileExistsAtPath?

时间:2016-10-24 22:23:18

标签: cocoa

fileExistsAtPath的文档读取:

  

尝试根据当前的状态来预测行为   文件系统或文件系统上的特定文件不是   推荐的。这样做可能会导致奇怪的行为或竞争条件。它的   更好地尝试操作(例如加载文件或创建)   一个目录),检查错误,并优雅地处理这些错误   而不是试图提前弄清楚是否操作   将会成功。有关文件系统竞争条件的更多信息,请参阅   安全编码指南中的竞争条件和安全文件操作。

但这对我来说似乎很荒谬。 fileExistsAtPath返回一个BOOL,显然通常用于"谓词行为"并在代码路径之间选择,例如使用条件。所以这个文档措辞的方式似乎暗示fileExistsAtPath应该从不使用 - 但这没有任何意义。

不试图预测行为的fileExistsAtPath的实际用途是什么?有没有?

如果没有,并且文档的措辞很差,那么fileExistsAtPath的实际用途是谓词行为,并且在发出警告时实际上是安全的吗?

1 个答案:

答案 0 :(得分:2)

好“不推荐”与“应该从不”使用不一样。

事实是,-fileExistsAtPath:和类似的API已经很常见了。在那段时间里,程序员已经获得了痛苦的经历,他们经常被滥用并且可能导致安全问题。因此,他们的文档已经过修改,以包含您通常不应使用的警告。

特别是,因为-fileExistsAtPath:返回true并不意味着当你去访问它时文件仍然存在。并且只是因为它返回false并不意味着如果你尝试在其位置创建某些东西它将不存在(并且你的尝试可能会失败,或者你可能会打开一个文件而不是创建一个文件)。

无论-fileExistsAtPath:可能告诉您什么,您都需要仔细处理所有情况,因此通常最好不要调用它。这是浪费的代码。

也就是说,在某些情况下使用它是合适的。例如,如果您的UI具有删除应用程序“拥有”的文件的控件,则可以在文件不存在时禁用该控件。但是你想要在每次通过应用程序的事件/更新循环时重新检查。此外,如果它已启用,因为该文件最近确实存在,那么当它实际上试图删除它时,如果它不存在,那么你的应用程序一定不会失败或做坏事。