使用NSURLtesting文件存在

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

但是,有一个任务我无法find基于URL的方法:testing文件是否存在。 我正在寻找一个基于URL的版本- [NSFileManager fileExistsAtPath: ] 。 像这种方法一样,如果URL描述了任何内容,不pipe是普通文件,目录还是其他内容,都应该返回YES

我可以尝试查找各种资源值 ,但是如果文件不存在,它们中的任何一个都不能保证不存在,如果它们中的一些(例如, NSURLEffectiveIconKey )可能是昂贵的。

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

在Cocoa,CF或Core Services中是否有简单的方法或函数来保证/logging给定的文件(或文件引用)URL是否指向存在的文件系统对象?

NSURL确实有这个方法:

 - (BOOL)checkResourceIsReachableAndReturnError:(NSError **)error 

其中“返回是否可以到达文件URL所指向的资源。”

 NSURL *theURL = [NSURL fileURLWithPath:@"/Users/elisevanlooij/nonexistingfile.php" isDirectory:NO]; NSError *err; if ([theURL checkResourceIsReachableAndReturnError:&err] == NO) [[NSAlert alertWithError:err] runModal]; 

在iOS上,我找不到任何其他的方式…

 NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"file.type"]; if ([[NSFileManager defaultManager] fileExistsAtPath:[storeURL path]]) {...} 

这里是Swift 2的答案:

 var error:NSError? let folderExists = theURL.checkResourceIsReachableAndReturnError(&error) 

确定给定的文件(或文件引用)URL是否指向存在的文件系统对象对于远程资源来说本质上是昂贵的,对于这个CFURLResourceIsReachable()和[NSURL checkResourceIsReachableAndReturnError:]的仅10.6(没有iPhoneOS)api是同步的,即使你会使用它们,对于很多文件,你仍然会看到显着的延迟开销。

你应该做的是用caching实现你自己的asynchronous检查例程,分别创build一个有效的资源列表。

否则,CFURLResourceIsReachable在标题状态中的注释为:

一个例子是定期维护UI状态,这取决于特定文档的存在。 当执行诸如打开文件的操作时,简单地尝试操作和处理故障比首先检查可达性更有效。

因为NSURL可以代表更多的本地文件系统,所以我不认为有一种通用的方法可以以可靠的方式testing它们的存在。 至less,cocoa基金会不包含这样的function(据我所知)。

如果你只处理本地文件系统,我build议你创build一个NSURLNSFileManager的类别,并带有一个urlExists:消息。 它会将NSURL转换为NSString (标准化path),然后调用[NSFileManager fileExistsAtPath:]消息。