NSFileManager的createDirectoryAtPath返回成功却未创建目录如何解决
解决方案
核心原因
你创建目录的代码逻辑本身没有问题,控制台输出创建成功的日志说明系统已经完成了目录创建操作,你看不到目录是iOS的沙盒权限限制导致你没有访问权限,不是目录没有被创建。
修复步骤
- 第一步:在项目的
Info.plist文件中添加两个权限配置项:- 将
UIFileSharingEnabled(可视化编辑显示为「Application supports iTunes file sharing」)设置为YES - 将
LSSupportsOpeningDocumentsInPlace(可视化编辑显示为「Supports opening documents in place」)设置为YES
配置完成后重新安装应用,你就能在iPhone系统「文件」APP、以及Finder连接手机后的「文件」分类下看到你的应用目录,也能找到你创建的文件夹。
- 将
- 第二步:如果你是在iOS模拟器上运行,可以在代码中打印完整沙盒路径确认位置:
在获取documentsDirectory之后添加一行日志:
复制输出的路径,打开Finder按下NSLog(@"Documents路径:%@", documentsDirectory);Command + Shift + G,粘贴路径即可直接跳转到对应目录,就能看到你创建的文件夹。 - 第三步(可选优化):建议将创建目录时的
withIntermediateDirectories参数改为YES,这样当你传入的文件夹名包含多级路径时,系统会自动创建所有不存在的父级目录,避免创建失败。
优化后代码
-(BOOL)createFolderInDocuments:(NSString *)folderName { NSError *error = nil; NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; // 打印路径方便调试定位 NSLog(@"Documents根路径:%@", documentsDirectory); NSString *dataPath = [documentsDirectory stringByAppendingPathComponent:folderName]; BOOL success = YES; if (![[NSFileManager defaultManager] fileExistsAtPath:dataPath]) // withIntermediateDirectories改为YES支持多级目录创建 success = [[NSFileManager defaultManager] createDirectoryAtPath:dataPath withIntermediateDirectories:YES attributes:nil error:&error]; if(error){ UIAlertController * alert = [UIAlertController alertControllerWithTitle:@"Error" message:[NSString stringWithFormat:@"Create folder: %@", error] preferredStyle:UIAlertControllerStyleAlert]; UIAlertAction* okButton = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action){}]; [alert addAction:okButton]; [self presentViewController:alert animated:YES completion:nil]; } if (success) { NSLog(@"Created folder with name %@,完整路径:%@", folderName, dataPath); } return success; }
内容的提问来源于stack exchange,提问作者yuchen
相关产品推荐
相关产品推荐

