OSTRACISM CO.
C#とObjective-CとJavaと...
ファイル検索
GraphicGripGropは指定されたディレクトリ以下のディレクトリを再帰的に検索する。.NET、Cocoa、Javaの各環境にはディレクトリの一覧を得るAPIが用意されているが、多少癖がある。
C#
void SearchDirectoryThread() {
...
SearchDirectorySub(m_topDirPath);
...
}
bool SearchDirectorySub(string dirPath) {
string[] files = Directory.GetFiles(dirPath);
foreach (string path in files) {
...
}
string[] dirs = Directory.GetDirectories(dirPath);
foreach (string path in dirs) {
if (SearchDirectorySub(path) == false)
return false;
}
return true;
}
TGraphicSearchクラスのSearchDirectorySubメソッドは再帰的にディレクトリの一覧を得てファイルを検索する。
.NETではディレクトリ一覧を得るAPIはファイルとディレクトリで独立になっている。一般的に他の環境や従来の環境(findfirstなど)では皆同列に一覧され、それがファイルなのかディレクトリなのかは後から自ら調べていた。なんとも割り切り方が面白い。
System.IO.Directory.GetFilesでファイルの一覧をSystem.IO.Directory.GetDirectoriesでディレクトリの一覧を得る。得られるパスは入力が相対なら相対、入力が絶対なら絶対となる。この例では使っていないが検索パターンを引き数にできるという意味でfindfirstを使いやすくしたものだとわかる。
Objective-C
- (void)searchDirectoryThread:(id)obj {
...
[self searchDirectorySub: m_topDirPath];
...
}
- (BOOL)searchDirectorySub:(NSString *)dirPath {
BOOL result = YES;
NSArray *contents = [[NSFileManager defaultManager] directoryContentsAtPath:dirPath];
int i;
for (i = 0; i < [contents count]; i++) {
...
NSString *name = [contents objectAtIndex: i];
NSString *path = [dirPath stringByAppendingPathComponent:name];
BOOL isDir;
if ([[NSFileManager defaultManager] fileExistsAtPath: path isDirectory: &isDir] && isDir) {
result = [self searchDirectorySub:path];
}
else if ([[NSFileManager defaultManager] fileExistsAtPath: path]) {
...
}
}
return result;
}
TGraphicSearchクラスのsearchDirectorySubメソッドは再帰的にディレクトリの一覧を得てファイルを検索する。
NSFileManagerのdirectoryContentsAtPathでディレクトリの一覧を得るが、これはまさしくディレクトリの一覧で、ファイル名またはディレクトリ名だけが得られる。パスとして組み立てるのはプログラムの役割だ。
ディレクトリパスとファイルパスでフルパスを組み立てるメソッドがあると良いのだが見つけられなかったので"/"で文字列を連結している。できればディレクトリセパレータを直接プログラムでは記述したくないのだがしかたがない。
その後さあもとさんの指摘により、NSStringクラスのstringByAppendingPathComponentがそういった機能のメソッドだと判明し修正。
Java
void searchDirectoryThread() {
m_work = new Thread() {
public void run() {
...
searchDirectorySub(m_topDirPath);
...
}
boolean searchDirectorySub(String dirPath) {
File dir = new File(dirPath);
File[] files = dir.listFiles();
int i;
for (i = 0; i < files.length; i++) {
...
if (files[i].isFile()) {
...
}
else if (files[i].isDirectory()) {
if (searchDirectorySub(files[i].getPath()) == false)
return false;
}
}
return true;
}
};
m_work.start();
}
TGraphicSearchクラスのsearchDirectorySubメソッドは再帰的にディレクトリの一覧を得てファイルを検索する。
Javaでは.NETやCocoaと違い、ファイルアクセスのためのjava.io.Fileクラスがディレクトリ一覧のメソッドを持っている。Cocoaと同様にパスがファイルなのかディレクトリなのかはプログラムが調べないといけない。とはいえisFileとかisDirectoryというのはわかりやすいメソッドだ。
.NETやCocoaはファイルパスの一覧は文字列の配列を受け取るが、JavaではFileクラスインスタンスの配列になっている。
2005.07.26
2005.09.18
「インデックス」へ戻る
OSTRACISM CO.
OSTRA / Takeshi Yoneki