使用NSURL测试文件存在

问题描述:

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

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

我可以尝试查找各种​​resource values,但是如果文件不存在,它们中的任何一个都不会明确保证不存在,并且如果它们中的一些(例如,NSURLEffectiveIconKey)可能是昂贵的。

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

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

NSURL的确有这种方法:“返回是否通过资源文件URL指向可以达到”

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

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

任何iPhone操作系统的开发者都会被这​​个答案抛出:'checkResourceIsReachableAndReturnError:'仅在10.6及更高版本中可用,并且尚未在iPhone SDK中提供。 – 2010-03-14 15:18:24

+4

更新:从iOS 4开始可用。 – 2010-08-05 20:30:04

+2

XCode 3.2.5(支持iOS 4.2)中的iOS文档声明:“此方法在iOS中未实现,因此它不执行任何操作。” – Daniel 2011-01-18 21:07:37

由于NSURL可以代表更多的本地文件系统,我不认为有一种通用的方法可以以可靠的方式测试它们的存在。至少,可可基金会不包含这样的功能(据我所知)。

如果您只处理本地文件系统,我建议您为NSURLNSFileManager创建一个类别,并附上urlExists:消息。它会将NSURL转换为NSString(标准化路径),然后调用[NSFileManager fileExistsAtPath:]消息。

+0

你可以将前面提到的'checkResourceIsReachableAndReturn错误:'用'isFileURL'来保持它的正常。 – 2011-11-23 02:49:55

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

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

否则在头状态的笔记CFURLResourceIsReachable:

An example would be periodic maintenance of UI state that depends on the existence of a particular document. When performing an operation such as opening a file, it is more efficient to simply try the operation and handle failures than to check first for reachability.

+1

我怀疑它很慢... NSURL保持一个链接到它所代表的HFS +文件系统条目。根据Apple的说法,URL比所有文件系统操作的路径快得多。 – 2014-03-28 22:41:08

在iOS上我找不到任何其他方式...

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

这里是斯威夫特2答案:

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

它应该是'checkResourceIsReachable() - > Void'并抛出异常,但是,你说的是正确的Xcode 7.x – 2016-05-30 09:35:34

+0

*抛出错误。 Swift错误与Objective-C异常不同。类似的语法,但目的不同。 – 2016-06-10 05:48:35