为什么NSFileManager的-fileExistsAtPath在路径正确时无法找到现有文件?

4

我知道iOS模拟器每次运行时都会在不同的目录中找到它。考虑到这一点,我有这段代码可以给出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。 - ninehundreds
我遇到了几乎相似的问题。如果我将路径存储为字符串,然后转换为绝对URL,它会失败。但是,如果我存储绝对字符串,然后不使用fileURLWithPath,而是使用urlWithName,则成功了,尽管只要我在正确的一半上就可以互换。 - Stephen J
1个回答

7
因为它仍然是一个URL。文件路径没有协议,所以您路径的前缀file:///是无效的,无法解析。由于无效路径不包含任何文件,fileExistsAtPath:返回NO
不过不用担心,您可以直接调用URL对象上的path而不是absoluteString,它将返回路径。

不起作用...你能给我一个例子吗,当你说“只需调用路径”时,你指的是什么?(以我的陈述为基础,它会是什么样子?)抱歉问这种愚蠢的问题,但我不知道它怎么能起作用... SD - SpokaneDude
@spokane-dude 不要调用 absoluteString,而是调用 path - JustSid
谢谢,谢谢!成功了...我在一些示例中看到了path语句,但在iOS文档中找不到解释...再次感谢! - SpokaneDude
1
@spokane-dude 你好!只是为了澄清一下,absoluteString 只是返回完整的 URL,但是作为一个字符串。而 path 则仅返回 URL 的路径,不包含协议等内容。对于文件 URL,如果您无法直接使用文件 URL,则这正是您想要的。 - JustSid
非常棒的回答...感谢您抽出时间向我解释。也祝您好运! :D - SpokaneDude

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接