是否有理由使用(FileManager)fileExistsAtPath:isDirectory:over(URL).hasDirectoryPath?

时间:2017-10-17 02:15:31

标签: objective-c swift

(FileManager)fileExistsAtPath:isDirectory:(URL).hasDirectoryPath之间的实际区别是什么?

我正在学习一些教程,他们首先使用了FileManager方法,但之后似乎始终使用了URL方法。在我看来,URL方法似乎更简洁,更容易记住。有没有理由使用FileManager方法? (如果答案是,请提供示例)

1 个答案:

答案 0 :(得分:4)

与接受的答案相反,差异不仅仅是可用性。 FileManager API实际访问磁盘上URL指向的文件,以查看它是否是目录,而hasDirectoryPath则不是;它仅检查URL的路径末尾是否有斜杠(/),这表示路径指向目录。您可以通过制作应用程序并在文件活动工具中运行它来验证这一点;使用FileManager,您会在目录中看到lstat64,而使用hasDirectoryPath则不会。{/ p>

这有一些影响:

  1. hasDirectoryPath显然会表现得更快,因为它无法访问磁盘。

  2. 但是,如果hasDirectoryPath的路径在尾部斜杠的存在方面不正确,URL可能会给出错误的结果。例如:

    URL(string: "file:///usr/bin")!.hasDirectoryPath // evaluates to false URL(string: "file:///usr/bin/")!.hasDirectoryPath // evaluates to true

  3. 最后,hasDirectoryPath可以使用非file: URL,例如http: URL,而FileManager显然不能。

  4. 尽管如此,当您需要通过文件系统进行检查时,最好在URL中使用基于FileManager的机制而不是基于路径的机制:

    let isDir = (try? self.resourceValues(forKeys: [.isDirectoryKey]))?.isDirectory ?? false