Objective-Cで非同期ファイルコピー のつづき

こないだ書いた非同期ファイルコピーの補足。 複数平行してやるやり方、および進捗状況の表示。 1ファイル1インスタンスなのが意外と盲点っぽいので追記。

こないだのコードだと

- (void) copyFile: (NSString*) destinationFilePath{    
    NSFileManager *fileManager = [NSFileManager defaultManager];
    totalBytes = (long)[[fileManager attributesOfItemAtPath: filePath error: nil] fileSize]; //インスタンス変数にコピーしたいファイルのバイト数を入れてやる
    中略
}

しておいて、コールバックか何かで返してあげれば良い。 (コメントアウトしてある部分)

- (void) controlCopyingState:(FSFileOperationRef) fileOp
          FileOperationStage: (FSFileOperationStage) stage
                      Status:(OSStatus) error
               DictionaryRef:(CFDictionaryRef)statusDictionary{
    if (error != noErr){
        //エラー処理
    }

	if (statusDictionary)
    {
		CFNumberRef bytesCompleted;
		bytesCompleted = (CFNumberRef) CFDictionaryGetValue(statusDictionary, kFSOperationBytesCompleteKey);
		
		double doubleBytesCompleted;
		CFNumberGetValue (bytesCompleted, kCFNumberMaxType, &doubleBytesCompleted);

        //[[NSNotificationCenter defaultCenter] postNotificationName: @"SetProgressBarCallback" object: [NSNumber numberWithDouble: doubleBytesCompleted]];		
		NSLog(@"%@ コピー済み: %f Bytes %f %d", filePath, doubleBytesCompleted, doubleBytesCompleted / totalBytes, totalBytes);
    }
	
	if (stage == kFSOperationStageComplete) {
        NSLog(@"コピー完了");
        //[[NSNotificationCenter defaultCenter] postNotificationName: @"CopyEndCallback" object: num];        
	}
}

呼び出すときは1ファイル1インスタンスで。 同じインスタンスを使い回すと挙動がおかしくなるので注意。

    FileEntry *entry = [[FileEntry alloc] initWithFilePath: @"SOURCE PATH 1"];
    [entry copyFile: @"DESTINATION PATH 1"];

    FileEntry *entry2 = [[FileEntry alloc] initWithFilePath: @"SOURCE PATH 2"];
    [entry2 copyFile: @"DESTINATION PATH 2"];

サンプルプロジェクト

Written on July 14, 2011