使用NSURL测试文件是否存在


73

Snow Leopard引入了许多新方法来使用NSURL对象来引用文件,而不是路径名或Core Services的FSRefs。

但是,有一项任务我找不到基于URL的方法来执行:测试文件是否存在。我正在寻找-[NSFileManager fileExistsAtPath:]的基于URL的版本。像该方法一样,YES如果URL描述了任何内容,无论是常规文件,目录还是其他内容,它都应返回。

我可以尝试查找各种资源值,但是如果文件不存在,则不会明确保证不存在任何资源值,如果确实存在,其中的某些资源(例如NSURLEffectiveIconKey)可能会很昂贵。

我可以只使用NSFileManager的fileExistsAtPath:,但是如果有一种更现代的方法,我宁愿使用它。

在Cocoa,CF或Core Services中是否有简单的方法或功能可以保证/记录下来,以告诉我给定的文件(或文件引用)URL是否引用存在的文件系统对象?

Answers:


142

NSURL确实具有此方法:

其中“返回是否可以访问文件URL指向的资源”。


3
对于被此答案抛弃的所有iPhone OS开发人员:checkResourceIsReachableAndReturnError:仅在10.6和更高版本中可用,而在iPhone SDK中尚不可用。
贾斯汀·塞尔斯

4
更新:它可以作为的iOS 4
彼得Hosey

2
XCode 3.2.5(支持iOS 4.2)中的iOS文档说明:“此方法在iOS中未实现,因此不执行任何操作。”
丹尼尔(Daniel)

19
另一个更新...它在iOS4中没有执行任何操作,尽管显然从iOS5.0起它现在已在iPhone中受支持
Ron

9
好主谁命名了这个功能?
devios1 '02

30

在iOS上,我找不到其他方法...


10

这是Swift 2的答案:


应该checkResourceIsReachable()->Void并且抛出异常,但是,您所说的对于Xcode 7.x是正确的
DawnSong

*抛出错误。Swift错误与Objective-C异常不同。语法相似,但目的不同。
Peter Hosey

2

确定给定文件(或文件引用)URL是否指向远程资源固有的代价是,此CFURLResourceIsReachable()和[NSURL checkResourceIsReachableAndReturnError:]的仅10.6(无iPhoneOS)API都是同步的,即使您要使用它们,但对于许多文件而言,您仍然会发现大量的延迟开销。

您应该做的是使用缓存实现自己的异步检查例程,该例程分别创建有效资源列表。

否则,在标头状态下的CFURLResourceIsReachable的注释:

一个示例是定期维护UI状态,该状态取决于特定文档的存在。当执行诸如打开文件之类的操作时,简单地尝试该操作并处理故障比先检查可访问性要有效得多。


1
我怀疑它很慢... NSURL维护一个指向它所代表的HFS +文件系统条目的链接。据苹果,网址是多少比所有文件系统操作的路径更快。
Abhi Beckert 2014年

1

因为NSURL可以代表的不是本地文件系统,所以我认为没有一种通用的方法可以可靠地测试它们的存在。至少,据我所知,可可基金会不包含此类功能。

如果你只处理本地文件系统,我建议你创建一个类别NSURL或者NSFileManager,用urlExists:消息。它将转换NSURLNSString(标准化路径),然后调用该[NSFileManager fileExistsAtPath:]消息。


您可以将上述内容checkResourceIsReachableAndReturnError:与之结合使用isFileURL以保持其理智。
肯尼·温克

0

在Swift中,您可以使用checkResourceIsReachable()方法,不幸的是,该方法将返回true(如果文件可以访问)或抛出错误(解释为什么无法访问文件)。

要获取布尔值true / false,请使用以下语法:

如果您想记录错误:

请记住,这是一项昂贵的操作,并且此操作可能会立即过时(如果其他进程正在删除磁盘文件或正在卸载磁盘文件,而您正在检查磁盘文件是否存在)。

通常,首选方法是不检查文件是否存在,而只是尝试读取或写入文件并在文件失败后再处理任何错误。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.