本記事では、フォルダ内を再帰的に検索して特定の拡張子を持つファイルを処理する方法を2つ紹介します。
サンプルコード
1.Directory.GetFilesメソッドを使用
ディレクトリ内のファイルを取得するDirectory.GetFilesメソッドを使用する際、オプションSearchOption.AllDirectoriesを指定することにより、メソッド内でサブディレクトリも含めて再帰的にファイル取得をおこないます。
using System;
using System.IO;
class Program
{
static void Main()
{
string folderPath = @"C:\path\to\your\directory";
ProcessFiles(folderPath);
}
static void ProcessFiles(string folderPath)
{
try
{
// 指定されたフォルダ内のすべてのファイルを取得
string[] files = Directory.GetFiles(folderPath, "*.txt", SearchOption.AllDirectories);
foreach (var file in files)
{
// ★ここに目的の処理を書く
Console.WriteLine(file);
}
}
catch (Exception ex)
{
Console.WriteLine("エラーが発生しました: " + ex.Message);
}
}
}
2.自分でメソッドの再帰呼び出し処理を実装する
チェック対象のディレクトリの中に入り、その中のファイルを処理。サブディレクトリがある場合は、サブディレクトリに入って、その中のファイルを処理、さらにサブディレクトリがある場合は・・・といったように、サブディレクトリがある間、延々と中に入ってファイルの探索を続ける処理です。
using System;
using System.IO;
class Program
{
static void Main()
{
string folderPath = @"C:\path\to\your\directory";
ProcessDirectory(folderPath);
}
static void ProcessDirectory(string folderPath)
{
try
{
// 指定されたフォルダ内のすべてのファイルを取得(1)
string[] files = Directory.GetFiles(folderPath, "*.txt");
foreach (var file in files)
{
// ★ここに目的の処理を書く
Console.WriteLine(file);
}
// 指定されたフォルダ内のすべてのサブフォルダを取得し、再帰的に処理(2)
string[] subDirectories = Directory.GetDirectories(folderPath);
foreach (var directory in subDirectories)
{
// メソッドの再帰呼び出し
ProcessDirectory(directory);
}
}
catch (Exception ex)
{
Console.WriteLine("エラーが発生しました: " + ex.Message);
}
}
}
(1)メソッドProcessDirectoryは、指定されたディレクトリの中にあるファイルをすべて処理します。
(2)サブディレクトリがある場合は、そのディレクトリに対して、自分自身であるProcessDirectoryメソッドを呼び出します。このように、現在実行中のメソッドの中で、同じメソッドを呼び出す処理を再帰処理といいます。
再帰処理を書く場合の注意点
再帰処理の終了条件を決めておく必要があります。今回の場合は、ディレクトリの階層の深さは有限であるため、ディレクトリ構造の末端に到達して「サブディレクトリが無くなること」を再帰処理の終了条件としています。
まとめ
本記事では、フォルダを再帰的に検索して特定の拡張子を持つファイルを処理する方法を2つ紹介しました。昔は再帰処理を自分で書く事が多かったのですが、最近のプログラミング言語は便利になっているな、と感じました。