Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/97.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios NSFileManager:无法在某些设备上创建目录_Ios_Ios9_Nsfilemanager_Ios9.1_Create Directory - Fatal编程技术网

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

Ios NSFileManager:无法在某些设备上创建目录,ios,ios9,nsfilemanager,ios9.1,create-directory,Ios,Ios9,Nsfilemanager,Ios9.1,Create Directory,我想下载一个zip文件,并使用以下代码段移动下载的文件: NSFileManager *fileManager = [NSFileManager defaultManager]; BOOL isDir; NSString *path = ...; NSString *targetPath = ...; NSString *targetDirectory = [targetPath stringByDeletingLastPathComponent]; if (![fileM

我想下载一个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测试人员报告说,在使用ios9.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"; 
路径总是通过读取临时目录resp的根路径生成的。文档目录,并通过附加文件名(deu_1.0.zip)来响应。子路径(/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对象中):

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


非常感谢您的回复。

我认为这是不对的:

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
}

根本没有理由检查目录是否存在。只需调用createDirectoryAtPath:WithMediateDirectory:YES。如果目录存在,它什么也不做,只返回YES。
if (![fileManager fileExistsAtPath:targetDirectory isDirectory:&isDir]) {
    // Create directory
} else if (!isDir) {
    // Report error: plain file using that name and cannot continue
}