使用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一个NSURL
或NSFileManager
的类别,并带有一个urlExists:
消息。 它会将NSURL
转换为NSString
(标准化path),然后调用[NSFileManager fileExistsAtPath:]
消息。