2

OK、基本的に私がやりたいことは次のとおりです。

  • アプリバンドル、たとえばフォルダーにファイルのリストがありますmyData(注意してください:サブフォルダー/ etc内にたくさんのファイル/フォルダーがあります)
  • ファイル ツリー全体をユーザーのディスク上の特定の場所にコピーしたい
  • 一部のファイルはコピーする前に処理する必要があるため、コピーする個別のファイルにアクセスする必要があります。

それについてどう思いますか?何か案は?


PS

  • については知っていますが、各ファイルへNSFileWrapperwriteFile:atomically:updateFilenamesアクセスを制限するわけではありません
  • 特定のフォルダーのファイル ツリーを取得する方法は既にあります。しかし、それでも私には少し遅いようです。そのための組み込みの(またはよりCocoaに適した)方法はありますか?
  • 非常に多くのファイルがあるため、GUI がフリーズしないようにプロセス全体を実行する必要があります。
4

1 に答える 1

6

Grand Central Dispatch(GCD)を使用して、メソッドを非同期的にスレッドで実行します

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    // user disk space - will use user document
    NSString *docuemntPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];

    // app bundle folder
    NSString *bundleRoot = [[NSBundle mainBundle] resourcePath];
    NSString *folderPath = [bundleRoot stringByAppendingPathComponent:@"aFolder"];

    NSArray *files = [[NSFileManager defaultManager] enumeratorAtPath:folderPath].allObjects;

    for (NSString *aFile in [files objectEnumerator]) { 
        NSString *copyPath = [folderPath stringByAppendingPathComponent:aFile];
        NSString *destPath = [docuemntPath stringByAppendingPathComponent:aFile];

        NSError *error;
        if ([[NSFileManager defaultManager] copyItemAtPath:copyPath toPath:destPath error:&error]) {
            NSLog(@"Copying successful");
            // here add a percent to progress view 
        } else {
            NSLog(@"Copying error: %@", error.userInfo);
        } 
    }

  // When the copying is finished update your UI 
  // on the main thread and do what ever you need with the object 
  dispatch_async(dispatch_get_main_queue(), ^{
    [self someMethod:myData];
  });
});

メインスレッドで UIProgressView を使用して、ファイル/フォルダーの数からファイル操作の進行状況を示します。

于 2013-08-20T11:08:51.513 に答える