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

时间:2011-10-24 16:33:35

标签: objective-c nsfilemanager

如何在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类参考,但我找不到适合我目的的任何合适的任务。

有任何提示吗?

3 个答案:

答案 0 :(得分:115)

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

来自documentation

  

如果此URL对象包含文件URL(由isFileURL确定),   该方法的返回值适合输入到方法中   NSFileManager或NSPathUtilities。如果路径有一个尾随斜杠它   被剥夺了。

答案 1 :(得分:14)

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

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

答案 2 :(得分:4)

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参数,但如果你与字符串混合,你可能会遇到麻烦。