2016-11-25 28 views
0

为fileExistsAtPath的文档读取:我们如何才能得到肯定确认文件*不存在于iOS中?

返回YES如果在规定的路径上的文件存在,或NO如果文件 不存在或它的存在不能被确定。

这似乎阻止我们使用这种方法来获取文件的没有的肯定确定。如果我们得到一个NO回来,它可能可能的意思是文件不存在,但它也可能意味着操作系统无法分辨。因此,确保文件不存在的最佳方式是什么?

回答

4

只要你没有对文件或文件夹的属性做任何奇怪的事情,只要你只在你的应用程序的沙箱中工作,那么使用fileExistsAtPath会给你你需要的答案。

只有在尝试访问应用沙盒外的文件时,或者如果您开始弄乱应用沙箱内的文件夹属性,例如删除读取或执行文件夹的能力,才会出现“无法确定” 。

+0

谢谢。请问你如何知道这是真的?有关于它的文档吗? –

+2

它的作用是使用Unix风格的操作系统30年,并自App Store开启以来一部分编写文件密集型iOS应用程序。我不知道是否有任何类似的具体文件。 – rmaddy

4

Apple建议不要依赖fileExistAtPath:方法。如果文件不存在,试着打开文件并处理错误通常会更好。

的NSFileManager类参考

注:试图谓词基于文件系统或文件系统中的特定文件的当前状态的行为是不推荐。这样做会造成奇怪的行为或竞赛状况。尝试一个操作(例如加载文件或创建目录),检查错误并妥善处理这些错误要比试图提前弄清操作是否成功要好得多。有关文件系统争用条件的更多信息,请参阅安全编码指南中的“争用条件和安全文件操作”。 来自安全编码指南。

而且从"Secure Coding Guide"

为了防止这种情况,程序经常检查,以确保一个临时文件具有特定名称并不在目标目录中已经存在。如果存在这样的文件,应用程序将删除它或为临时文件选择一个新名称以避免冲突。如果文件不存在,应用程序将打开文件进行写入,因为打开文件进行写入的系统例程会自动创建一个新文件(如果不存在)。

攻击者通过持续运行一个程序来创建一个具有合适名称的新临时文件,可以(在保持一点点运气的情况下)在应用程序检查时确保临时文件并不存在,当它打开写作。然后应用程序打开攻击者的文件并写入它(请记住,系统例程会打开一个现有文件(如果有的话),并且仅在没有现有文件时才创建一个新文件)。

攻击者的文件可能具有与应用程序的临时文件不同的访问权限,因此攻击者可以读取内容。或者,攻击者可能已经打开文件。攻击者可以使用硬链接或其他文件(攻击者拥有的文件或现有系统文件)的一个硬链接或符号链接替换文件。例如,攻击者可以通过与系统密码文件的符号链接替换该文件,以便在攻击之后,系统密码已损坏,以至于没有人(包括系统管理员)可以登录。

相关问题