为什么 NSFIleManager -fileExistsAtPath 在路径正确时找不到现有文件?
Why can't NSFIleManager -fileExistsAtPath not find an existing file when path is correct?
我知道 iOS 模拟器每次都是在不同的目录中找到的 运行;考虑到这一点,我有这段代码,它为我提供了核心数据 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 的文件图像:
问题是:我转到 sqliteFilePath 并且 saori.sqlite 文件确实存在!为什么 -fileExistsAtPath 失败?
因为还是一个URL。文件路径没有协议,因此您的路径前缀 file:///
无效且无法解析。由于无效路径不包含任何文件,fileExistsAtPath:
returns NO
.
不过不用担心,不用在 URL 对象上调用 absoluteString
,您可以只调用 path
,它会 return 路径。
我知道 iOS 模拟器每次都是在不同的目录中找到的 运行;考虑到这一点,我有这段代码,它为我提供了核心数据 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 的文件图像:
问题是:我转到 sqliteFilePath 并且 saori.sqlite 文件确实存在!为什么 -fileExistsAtPath 失败?
因为还是一个URL。文件路径没有协议,因此您的路径前缀 file:///
无效且无法解析。由于无效路径不包含任何文件,fileExistsAtPath:
returns NO
.
不过不用担心,不用在 URL 对象上调用 absoluteString
,您可以只调用 path
,它会 return 路径。