2

次のコード スニペットを使用して、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 でも問題なく動作しました。現在、一部のベータ テスターは、ターゲット ディレクトリが存在しないため、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"; 

パスは、一時ディレクトリ 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 オブジェクトに格納されます)。

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

とにかく、一番上のコード スニペットは、ターゲット ディレクトリが存在するかどうかを確認します。そうでない場合は、ターゲット ディレクトリが作成されます。最後に、zip ファイルを一時ディレクトリからターゲット ディレクトリに移動する必要があります。それが意図であり、テスト デバイスでも問題なく動作します。ただし、すべてのデバイス、特に iOS 9.x を実行しているデバイスではそうではありません。誰かが理由を知っていますか?ディレクトリの作成中またはファイルの移動中に iOS 9.x に既知のバグがあるかどうか誰か知っていますか?

ご回答ありがとうございます。

4

1 に答える 1

1

私はこれが正しいとは思わない:

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
}
于 2015-11-26T13:21:37.863 に答える