fileExistsAtPath的文档读取:
尝试根据当前的状态来预测行为 文件系统或文件系统上的特定文件不是 推荐的。这样做可能会导致奇怪的行为或竞争条件。它的 更好地尝试操作(例如加载文件或创建) 一个目录),检查错误,并优雅地处理这些错误 而不是试图提前弄清楚是否操作 将会成功。有关文件系统竞争条件的更多信息,请参阅 安全编码指南中的竞争条件和安全文件操作。
但这对我来说似乎很荒谬。 fileExistsAtPath返回一个BOOL,显然通常用于"谓词行为"并在代码路径之间选择,例如使用条件。所以这个文档措辞的方式似乎暗示fileExistsAtPath应该从不使用 - 但这没有任何意义。
不试图预测行为的fileExistsAtPath的实际用途是什么?有没有?
如果没有,并且文档的措辞很差,那么fileExistsAtPath的实际用途是谓词行为,并且在发出警告时实际上是安全的吗?
答案 0 :(得分:2)
好“不推荐”与“应该从不”使用不一样。
事实是,-fileExistsAtPath:
和类似的API已经很常见了。在那段时间里,程序员已经获得了痛苦的经历,他们经常被滥用并且可能导致安全问题。因此,他们的文档已经过修改,以包含您通常不应使用的警告。
特别是,因为-fileExistsAtPath:
返回true并不意味着当你去访问它时文件仍然存在。并且只是因为它返回false并不意味着如果你尝试在其位置创建某些东西它将不存在(并且你的尝试可能会失败,或者你可能会打开一个文件而不是创建一个文件)。
无论-fileExistsAtPath:
可能告诉您什么,您都需要仔细处理所有情况,因此通常最好不要调用它。这是浪费的代码。
也就是说,在某些情况下使用它是合适的。例如,如果您的UI具有删除应用程序“拥有”的文件的控件,则可以在文件不存在时禁用该控件。但是你想要在每次通过应用程序的事件/更新循环时重新检查。此外,如果它已启用,因为该文件最近确实存在,那么当它实际上试图删除它时,如果它不存在,那么你的应用程序一定不会失败或做坏事。