为什么NSFIleManager -fileExistsAtPath在路径正确时找不到现有文件?

时间:2015-02-03 00:05:46

标签: objective-c ios-simulator nsfilemanager ios8.1

我知道iOS Simulator每次运行时都会在不同的目录中找到;考虑到这一点,我有这个代码,它给了我Core Data sqlite文件的目录:

//  find current directory for saori.sqlite
NSFileManager *fileManager = [NSFileManager defaultManager];
NSURL *documentDirectory = [[fileManager URLsForDirectory:NSLibraryDirectory inDomains:NSUserDomainMask]firstObject];
NSString *sqliteFilePath  = [[documentDirectory URLByAppendingPathComponent:@"Application Support/SalonBook/saori.sqlite"] absoluteString];
if ([fileManager fileExistsAtPath:sqliteFilePath])
    [MagicalRecord cleanUp];  //  set stack, etc to 'nil'
else  {
    NSLog(@"\n\n-->sqlite files not found");  // log message "unable to find sqlite files
    return;
}

这是sqliteFilePath对象的打印输出:

Printing description of sqliteFilePath:
file:///Users/rolfmarsh/Library/Developer/CoreSimulator/Devices/1EE69744-255A-45CD-88F1-63FEAD117B32/data/Containers/Data/Application/C8FF20F0-41E4-4F26-AB06-1F29936C2208/Library/Application%20Support/SalonBook/saori.sqlite

这是来自Finder的文件图片: enter image description here

问题是:我转到 sqliteFilePath 并且确实存在saori.sqlite文件!为什么 -fileExistsAtPath 失败?

1 个答案:

答案 0 :(得分:7)

因为它仍然是一个URL。文件路径没有协议,因此路径file:///的前缀无效且无法解析。由于无效路径不包含任何文件,fileExistsAtPath:会返回NO

不过不用担心,您可以只调用absoluteString而不是在网址对象上调用path,而是返回路径。