2011年6月30日木曜日

Cocoa ファイルの非同期コピー(4)

というわけでFileCopyManagerを作成中。

こんなダイアログを表示しようと考えている。


コピーするファイルのサイズの合計、コピーしているファイルのサイズ、それぞれの進行状況、コピーしているファイル名及びアイコン、などなどを表示する。

cancelボタンも作ってみた。ということは、「複数コピーしているファイルのうちのひとつだけキャンセル」、「コピーそのもののキャンセル」といった処理も必要となる。

コピーをキャンセルということはコピー中のファイルも削除しないといけないわけで、なんとなくできるかどうか不安になるな。(^^;)

本日はinitメソッドを考えて、書いて、それでほぼ終了。
素人なので初期化ひとつとってもすらすらとはいかない。
今回のFileCopyManager、結局初期化はこんな風にした。

-(id)initWithDistURL:(NSURL*)dURL copyFileArray:(NSArray*)fArray{
    self=[super init];
    if(self){
        [NSBundle loadNibNamed:@"FileCopyDialog" owner:self];
        NSFileManager* fileManager=[NSFileManager defaultManager];
        BOOL isDir, valid;
        valid=[fileManager fileExistsAtPath:[dURL path] isDirectory:&isDir];
        if (!valid || !isDir) {
            return nil;
        }
        if([fArray count]<=0){
            return nil;
        }
        [self setDistURL:dURL];
        [self setFileArray:fArray];        
    }
    return self;
}

filemanagerを生成する必要はなかったけれど、最初はsourceURLも初期化の引数にしていたので生成している。結局、sourceURLはコピー元のフルパスがわかれば必要ないので割愛したが。

コピー先のURLが無効ならFileCopyManager自体を生成しないようにしているが、これって今考えたんだがあまりよろしくない。無効ならそのパスを作る、が正しい気がする。(ドラッグアンドドロップでのコピー操作をメインに考えているため、無効なパスへのコピー操作はそもそも発生しない、という事情もある)

distURLとfileArrayはpropatyでそれぞれ

@property (assign) NSURL*distURL;
@property (retain) NSArray* fileArray;

と宣言しているため、セッタゲッタが自動で作られるから、FileCopyManagerのオブジェクトを生成したあと、オブジェクトの外部からsetDistURLとする方法もあるわけで、この辺の使い分け方がまだよくわかっていない。

今回はコピー先やコピーファイル群が無効ならオブジェクトを生成しないでnilを返す、という方向でいいような気がしているが。

FileCopyManagerのオブジェクトがnilでないなら、[fileCopyManager startFileCopy]みたいなメソッドを呼び出せば呼び出し側の処理は終了、というふうにしようと考えている。

しかし残念ながら、明日からはいよいよ学期末モードに突入の予定。家で通知表作成の作業に入る。どうしてもExcelを使わないと済まないので、Winを起動せざるをえない。あまりプログラミングに時間がとれないなあ。悲しい。

0 件のコメント:

コメントを投稿