• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ios - NSFileManager:无法在某些设备上创建目录

[复制链接]
菜鸟教程小白 发表于 2022-12-13 12:00:01 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我想下载一个 zip 文件并使用此代码段移动下载的文件:

NSFileManager *fileManager = [NSFileManager defaultManager];  
BOOL isDir;  
NSString *path = ...;  
NSString *targetPath = ...;  

NSString *targetDirectory = [targetPath stringByDeletingLastPathComponent];  
if (![fileManager fileExistsAtPath:targetDirectory isDirectory:&isDir] && !isDir)  
{  
     NSError *dirError;  
     if (! [fileManager createDirectoryAtPath:targetDirectory withIntermediateDirectories:YES attributes:nil error:&dirError])  
     {  
          NSLog(@"%@", dirError.localizedDescription);  
     }  
}  


//...  



if ([fileManager moveItemAtPath:path toPath:targetPath error:&error])  
{  
     success = YES;  
} 

它在我们的测试设备上运行良好,在 iOS 8.x 上也运行良好。现在,一些 beta 测试人员报告说,在 iOS 9.x 设备上移动 zip 文件失败,因为目标目录不存在。不是一般情况下,仅在少数运行 iOS 9.x 的设备上。我已将我们的测试设备更新到 iOS 9.1,它仍然可以工作。所有测试用户的 zip 文件都相同。

路径不是硬编码的,而是在代码片段之前生成的。 zip 文件总是从临时根目录复制到子路径/map/maps/deu/deu_1.0.zip ,例如

path = @"/private/var/mobile/Containers/Data/Application/0EAF2FEE-4E9F-4826-94AE-7D31D2B4D8E7/tmp/deu_1.0.zip";  
targetPath = @"/var/mobile/Containers/Data/Application/0EAF2FEE-4E9F-4826-94AE-7D31D2B4D8E7/Documents/map/maps/deu/deu_1.0.zip";  
targetDirectory = @"/var/mobile/Containers/Data/Application/0EAF2FEE-4E9F-4826-94AE-7D31D2B4D8E7/Documents/map/maps/deu"; 

路径总是通过读取临时目录的根路径生成。文件目录和附加文件名(deu_1.0.zip)resp。子路径(/map/maps/deu/deu_1.0.zip):

来自辅助类 MCPath:

+ (NSString *)directoryDocuments  
{  
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
    NSString *directory = [paths objectAtIndex:0];  
    return directory;  
}  
+ (NSString *)directoryTemporaryFiles  
{  
    return NSTemporaryDirectory();  
} 

这是生成路径的片段(从 URL 读取的文件名,但始终是相同的 URL,子路径存储在 mapInfo 对象中):

NSString *path = [[MCPath directoryTemporaryFiles] stringByAppendingPathComponent:[url lastPathComponent]];  
NSString *targetPath = [[MCPath directoryMap] stringByAppendingPathComponent:[mapInfo subPath:YES]]; 

但无论如何,顶部的代码片段会检查目标目录是否存在。如果没有,则创建目标目录。最后,应该将 zip 文件从临时目录移动到目标目录。这就是目的,它在我们的测试设备上也能正常工作。但并非在所有设备上,尤其是在运行 iOS 9.x 的设备上。有人知道为什么吗?有人知道 iOS 9.x 在创建目录或移动文件时是否存在已知错误吗?

非常感谢您的回复。



Best Answer-推荐答案


我不认为这是正确的:

if (![fileManager fileExistsAtPath:targetDirectory isDirectory:&isDir] && !isDir)

关于 isDirectory 的文档说明了这一点:如果路径不存在,则返回时该值未定义。

因此 && !isDir 肯定是错误的。

你想要:

if (![fileManager fileExistsAtPath:targetDirectory isDirectory:&isDir]) {
    // Create directory
} else if (!isDir) {
    // Report error: plain file using that name and cannot continue
}

关于ios - NSFileManager:无法在某些设备上创建目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33939686/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap