使用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];
由于NSURL可以代表更多的本地文件系统,我不认为有一种通用的方法可以以可靠的方式测试它们的存在。至少,可可基金会不包含这样的功能(据我所知)。
如果您只处理本地文件系统,我建议您为NSURL
或NSFileManager
创建一个类别,并附上urlExists:
消息。它会将NSURL
转换为NSString
(标准化路径),然后调用[NSFileManager fileExistsAtPath:]
消息。
你可以将前面提到的'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.
我怀疑它很慢... 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)
它应该是'checkResourceIsReachable() - > Void'并抛出异常,但是,你说的是正确的Xcode 7.x – 2016-05-30 09:35:34
*抛出错误。 Swift错误与Objective-C异常不同。类似的语法,但目的不同。 – 2016-06-10 05:48:35
任何iPhone操作系统的开发者都会被这个答案抛出:'checkResourceIsReachableAndReturnError:'仅在10.6及更高版本中可用,并且尚未在iPhone SDK中提供。 – 2010-03-14 15:18:24
更新:从iOS 4开始可用。 – 2010-08-05 20:30:04
XCode 3.2.5(支持iOS 4.2)中的iOS文档声明:“此方法在iOS中未实现,因此它不执行任何操作。” – Daniel 2011-01-18 21:07:37