NSFileManager:无法在某些设备上创建目录
NSFileManager: Unable to create directory on some devices
我想下载一个 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):
来自助手 class 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 中是否存在已知错误吗?
非常感谢您的回复。
我不认为这是正确的:
if (![fileManager fileExistsAtPath:targetDirectory isDirectory:&isDir] && !isDir)
有关 isDirectory
的文档说明:如果路径不存在,则此值在 return 时未定义。
因此&& !isDir
肯定是错误的
你想要:
if (![fileManager fileExistsAtPath:targetDirectory isDirectory:&isDir]) {
// Create directory
} else if (!isDir) {
// Report error: plain file using that name and cannot continue
}
我想下载一个 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):
来自助手 class 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 中是否存在已知错误吗?
非常感谢您的回复。
我不认为这是正确的:
if (![fileManager fileExistsAtPath:targetDirectory isDirectory:&isDir] && !isDir)
有关 isDirectory
的文档说明:如果路径不存在,则此值在 return 时未定义。
因此&& !isDir
肯定是错误的
你想要:
if (![fileManager fileExistsAtPath:targetDirectory isDirectory:&isDir]) {
// Create directory
} else if (!isDir) {
// Report error: plain file using that name and cannot continue
}