在IOS中检查Documents目录的子目录时出错

Posted

技术标签:

【中文标题】在IOS中检查Documents目录的子目录时出错【英文标题】:Error checking for subdirectory of Documents directory in IOS 【发布时间】:2015-01-22 16:35:17 【问题描述】:

我的应用需要创建 Documents 目录的子目录。下面的代码返回目录 URL。第一次通过它创建目录,但下一次失败,因为 fileExistsAtPath: 声称该目录仍然不存在。我知道它存在,因为我已将捆绑包设置为使文件在 iTunes 中可见,并且我可以在 iTunes 中看到它。知道我做错了什么吗?

- (NSURL *)applicationDocumentsDirectory

    return [[[NSFileManager defaultManager]   URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];


- (NSURL *)applicationSubDirectory

    NSFileManager *manager = [NSFileManager defaultManager];
    NSURL *docDir = [self applicationDocumentsDirectory];
    docDir = [docDir URLByAppendingPathComponent:@"Sub" isDirectory:YES];
    NSString *docDirPath = [docDir absoluteString];
    BOOL isFolder = YES;

    if(!([manager fileExistsAtPath:docDirPath isDirectory:&isFolder] && isFolder))    
        NSError *error = nil;
        BOOL ret = [manager createDirectoryAtURL:docDir withIntermediateDirectories:NO attributes:nil error:&error];
        if(!ret) 
            NSLog(@"ERROR app support: %@", error);
            abort();
        
    
    return docDir;

【问题讨论】:

对于初学者NSLog() docDirPath 并将其添加到问题中。同时提供错误信息。 错误测试纯粹是为了测试,不是生产代码。 docDirPath 用作 fileExistsAtPath: 的参数。代码生成cocoa错误4. 我已经解释了代码试图做什么。我只是要求有人解释为什么 fileExistsAtPath: 在相关目录已经存在时返回 false 。有 NSFileManager 经验的人可能能够做到这一点。还需要什么其他信息? 我知道我的代码已损坏,这就是我发布求助请求的原因。这可能是我误解的适用于目录的规则。我不知道要提供什么额外信息。也许您可能会提出一些对您有帮助的建议。 看第一条评论。 【参考方案1】:

你想使用path而不是absoluteString 前者返回完整的url绝对路径,类似于“file:///...”,而后者只返回文件路径。

NSString *docDirPath = [docDir path];

因此,由于您正在寻找一个永远不会存在的路径为“file:///....”的文件,因此检查总是失败。当你去创建目录时,你使用 URL 创建它,所以它可以工作。

【讨论】:

遗憾的是 OP 不会提供 docDirdocDirPath 的 NSLog(),他可能自己想出来了.. 谢谢大卫。如果 Zaph 已经知道答案,那么他说出来会很有帮助。我已经看过数据并错过了显而易见的事情。它有时会发生。

以上是关于在IOS中检查Documents目录的子目录时出错的主要内容,如果未能解决你的问题,请参考以下文章

iOS 沙盒 - 保护 Documents 目录中的数据

从 Documents 目录在 UIWebview 中打开时,ios-css 和 js 无法在 html 文件中链接

将文件夹移动到 Documents 目录

防止篡改 iOS 上 Documents 目录中的文件

iOS - 从 Documents 目录中的 bundle 加载 xib

从cordova html页面(cordova)加载保存在iOS App Documents目录中的图像?