再帰的にフォルダを探索する(C#)
指定したフォルダ内の全ファイル(サブフォルダ内のファイルも含む)を処理する方法です。
クレノティが作った多画像拡縮でもこのような方法でフォルダ内の画像ファイルを処理しています。
Directory.GetFiles(string path)は、指定したディレクトリ内のファイル名を得るメソッドです。
Directory.GetDirectories(string path)は、指定したディレクトリ内のサブディレクトリ名を得るメソッドです。
以下のソース内のBaseProcessorクラスを継承してDirectoryProcessとFileProcessを実装すればディレクトリ内の全ファイルに好きな処理をすることができます。
// ディレクトリとファイルを処理するための抽象クラス
public abstract class BaseProcessor
{
public abstract void DirectoryProcess(string directory);
public abstract void FileProcess(string fileName);
}
// ディレクトリとファイルの処理を実装したクラス
// ディレクトリ名とファイル名を表示する
public class DisplayNameProcessor : BaseProcessor
{
public override void DirectoryProcess(string directory)
{
Console.Out.WriteLine(directory);
}
public override void FileProcess(string fileName)
{
Console.Out.WriteLine(fileName);
}
}
// 再帰的にディレクトリ内を探索するクラス
public class ReflexiveDirectory
{
private BaseProcessor processor_;
public ReflexiveDirectory(BaseProcessor processor)
{
processor_ = processor;
}
public void Execute(string directory)
{
string[] fileEntries = Directory.GetFiles(directory);
foreach (string fileName in fileEntries)
{
// ファイルを処理します
processor_.FileProcess(fileName);
}
string [] subDirectoryEntries = Directory.GetDirectories(directory);
foreach(string subDirectory in subDirectoryEntries)
{
if (!directory.Equals(subDirectory))
{
// ディレクトリを処理します
processor_.DirectoryProcess(subDirectory);
// サブディレクトリに対しても同じ処理を繰り返します
this.Execute(subDirectory);
}
}
}
}
|
呼び出すときは、以下の様にします。
ReflexiveDirectory reflexiveDir = new ReflexiveDirectory(new DisplayNameProcessor());
reflexiveDir.Execute(@"C:\hogehoge");
|
|