Cocoa 使用NSURL测试文件存在性

Cocoa 使用NSURL测试文件存在性,cocoa,osx-snow-leopard,nsurl,core-foundation,nsfilemanager,Cocoa,Osx Snow Leopard,Nsurl,Core Foundation,Nsfilemanager,Snow Leopard引入了许多新方法来使用NSURL对象引用文件,而不是路径名或核心服务的FSREF 然而,有一项任务我找不到基于URL的方法:测试文件是否存在。我正在寻找一个基于URL的版本的。与该方法类似,如果URL描述了任何内容,无论是常规文件、目录还是其他内容,它都应该返回YES 我可以尝试查找各种文件,但是如果文件不存在,它们中没有一个是明确保证不存在的,如果文件不存在,其中一些(例如)可能会很昂贵 我可以使用NSFileManager的fileExistsAtPath:,但如果有

Snow Leopard引入了许多新方法来使用NSURL对象引用文件,而不是路径名或核心服务的FSREF

然而,有一项任务我找不到基于URL的方法:测试文件是否存在。我正在寻找一个基于URL的版本的。与该方法类似,如果URL描述了任何内容,无论是常规文件、目录还是其他内容,它都应该返回
YES

我可以尝试查找各种文件,但是如果文件不存在,它们中没有一个是明确保证不存在的,如果文件不存在,其中一些(例如)可能会很昂贵

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


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

因为NSURL可以表示更多的本地文件系统,我不认为有一种通用的方法可以可靠地测试它们的存在。至少,可可基金会并没有包含这样的功能(据我所知)。
如果您只处理本地文件系统,我建议您为
NSURL
NSFileManager
创建一个类别,并显示
urlExists:
消息。它会将
NSURL
转换为
NSString
(规范化路径),然后调用
[NSFileManager fileExistsAtPath:]
消息。

NSURL有以下方法:

- (BOOL)checkResourceIsReachableAndReturnError:(NSError **)error
它“返回是否可以访问文件URL指向的资源。”


确定给定的文件(或文件引用)URL是否引用存在的文件系统对象对于远程资源来说成本高昂,此CFURLResourceIsReachable()和[NSURL checkResourceIsReachableAndReturnError:]的仅10.6版(无iPhoneOS)api都是同步的,即使您将使用它们,对于许多文件,您仍然会看到显著的延迟开销

您应该使用缓存实现自己的异步检查例程,该缓存单独创建有效资源的列表

否则,cfurlResources的注释可在标头状态下删除:

一个例子是定期维护UI状态,这取决于 关于某一特定文件的存在。在执行 操作(如打开文件),只需尝试 操作和处理故障,而不是首先检查可达性


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

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

以下是Swift 2的答案:

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

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

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

let exists = (try? inputFile.checkResourceIsReachable()) ?? false
如果要记录错误,请执行以下操作:

let exists: Bool
do {
  exists = try inputFile.checkResourceIsReachable()
} catch {
  exists = false
  print(error.localizedDescription)
}
请记住,这是一项代价高昂的操作,并且可能会在之后立即过期(如果在检查磁盘文件是否存在时,其他进程正在删除或卸载磁盘文件)


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

对于任何被此答案抛出的iPhone OS开发者:
checkResourceIsReachableAndReturnError:
仅在10.6及更高版本中可用,但在iPhone SDK中尚不可用。更新:从iOS 4开始提供。iOS文档在XCode 3.2.5中(支持iOS 4.2)状态:“此方法在iOS中未实现,因此不执行任何操作。”另一个更新…它在iOS4中没有执行任何操作,尽管很明显,从iOS5.0开始,它现在在iPhone上得到了支持。是谁命名了这个函数?你可以将前面提到的
checkResourceIsReachableAndReturnError:
isFileURL
结合起来,以保持它的正常运行。我怀疑它的速度太慢了…NSURL维护着到HFS+文件系统的链接它所代表的em项。根据苹果公司的说法,URL比所有文件系统操作的路径都快得多。它应该是
checkResourceIsReachable()->Void
和throw exception,但是,您所说的对于Xcode 7.x*throw error是正确的。Swift错误与Objective-C异常不同。语法相似,但用途不同。
let exists: Bool
do {
  exists = try inputFile.checkResourceIsReachable()
} catch {
  exists = false
  print(error.localizedDescription)
}