ページ

2009年2月3日火曜日

ファイル名変更(その5)ファイル一覧取得を修正

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

保存先をデスクトップにして SimpleViewerを開いたところ、少し待たされた後にファイル数が数千と表示されていた。どうも以前書いたコードではサブディレクトリまで見に行っているようだ。

以前のコード。
FileList.m

 NSDirectoryEnumerator* dir_enum = [fm enumeratorAtPath:path];
FileEntry* entry;

NSString* filename;
NSDictionary* attrs;
while (filename = [dir_enum nextObject]) {
if ([self isTargetFilename:filename]) {
attrs = [dir_enum fileAttributes];
if ([[attrs objectForKey:NSFileType] isEqualToString:NSFileTypeRegular]) {
entry = [[[FileEntry alloc] initWithFilename:filename
fileAttributes:attrs] autorelease];
[_list addObject:entry];
}
}
}


マニュアルを良く読むと #enumeratorAtPath: はサブディレクトリまで見に行くと書いてあった。あらら。#contentsOfDirectoryAtPath:error: で書き直す。
 NSError* error;
NSFileManager* fm = [NSFileManager defaultManager];
FileEntry* entry;
for(NSString* filename in [fm contentsOfDirectoryAtPath:path error:&error]) {
if ([self isTargetFilename:filename]) {
entry = [[[FileEntry alloc] initWithFilename:filename
fileAttributes:[fm fileAttributesAtPath:[path stringByAppendingPathComponent:filename] traverseLink:NO]] autorelease];
[_list addObject:entry];
}
}

やってみるとそれほど面倒でない上に、フォルダや . で始まるファイルなどは含まれないので、実はこちらの方が使いやすかった。

- - - - -
ビューアでサブディレクトリまで見えるのはそれなりに便利だが、U/Iと内部実装をちゃんと作らないと使い物にならない。この辺りは今後の課題か。