使用 NSURL 测试文件存在性

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

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

我可以尝试查找各种 资源价值,但是如果文件不存在,那么它们中没有一个是明确保证不存在的,而且如果存在的话,其中一些(例如,关键词)可能会很昂贵。

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

在 Cocoa、 CF 或 Core Services 中是否有一个简单的方法或函数能够保证/文档化地告诉我给定的文件(或文件引用) URL 是否指向存在的文件系统对象?

44661 次浏览

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

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

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];

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

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

否则,CFURLResourceIsReachintheheader 状态的注释:

一个例子是定期维护 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(如果文件可以访问的话) ,要么抛出一个错误(解释为什么无法访问它)。

要获得 bool 的 true/false 值,请使用以下语法:

let exists = (try? inputFile.checkResourceIsReachable()) ?? false

如果您想记录错误:

let exists: Bool
do {
exists = try inputFile.checkResourceIsReachable()
} catch {
exists = false
print(error.localizedDescription)
}

请记住,这是一个昂贵的操作,它可能过期后立即(如果其他进程正在删除或卸载磁盘文件,而您正在检查它是否存在)。

一般来说,首选的方法不是检查文件是否存在,而是简单地尝试读或写文件,并在失败后处理任何错误。