检查文件是否存在于 URL 而非路径

如何检查文件是否存在于 URL (而不是路径) ,以便在 iPhone 模拟器中设置预填充的默认存储:

NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Food.sqlite"];
/*
Set up the store.
For the sake of illustration, provide a pre-populated default store.
*/
NSFileManager *fileManager = [NSFileManager defaultManager];
// If the expected store doesn't exist, copy the default store.
if (![fileManager fileExistsAtPath:storePath]) {
NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"Food" ofType:@"sqlite"];
if (defaultStorePath) {
[fileManager copyItemAtPath:defaultStorePath toPath:storePath error:NULL];
}
}

我了解到在模板的最新版本中,applicationDocumentsDirectory 方法返回一个 URL,因此我修改了代码,使用 NSURL 对象来表示文件路径。但是在 [fileManager fileExistsAtPath:storePath],我需要将 fileExistsAtPath改为类似于 fileExistsAtURL的东西(显然它不存在)。

我检查了 NSFileManager 类引用,没有发现任何适合我的任务。

有什么提示吗?

30622 次浏览
if (![fileManager fileExistsAtPath:[storeURL path]])
...

来自 文件:

如果此 URL 对象包含文件 URL (由 isFileURL 确定) , 此方法的返回值适合输入到 NSFileManager 或 NSPathUtitility。如果路径的尾部有一个斜杠,则为 被剥离了。

if (![fileManager fileExistsAtPath:[storeURL path]])

可以,但要小心: 如果是这样的网址:

..../Documents/1158a3c96ca22c41b8e731b1d1af0e1e?d=mm&s=50

[storeURL path]会给你那条路径(它适用于 [storeURL lastPathComponent]:

..../Documents/1158a3c96ca22c41b8e731b1d1af0e1e

但是如果你在像 /var/mobile/Applications/DB92F4DC-49E4-4B4A-8271-6A9DAE6963BC/Documents/1158a3c96ca22c41b8e731b1d1af0e1e?d=mm&s=50这样的字符串上使用 lastPathComponent,它会给你 1158a3c96ca22c41b8e731b1d1af0e1e?d=mm&s=50

这是好事,因为在一个网址,’用于 GET 参数,但是如果与字符串混用,则可能会遇到麻烦。

对于文件系统,URL NSURL本身有一个检查 URL 可访问性的方法

NSError *error;
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Food.sqlite"];
if ([storeURL checkResourceIsReachableAndReturnError:&error]) {
// do something
} else {
NSLog(@"%@", error);
}

对于在 Swift 5上阅读这篇文章的人来说,我是这样做到的:

func doesFileExist(url: URL) -> Bool {
let fileManager = FileManager.default
return fileManager.fileExists(atPath: url.path)
}