System.IO.Directory.EnumerateFilesメソッドを使うと指定したフォルダ内にあるファイルの一覧を取得することができます。
System.IO.Directory.GetFilesメソッドでも同じことができますが、GetFilesの場合はフォルダ内のファイルをすべて検索してから戻り値を返すのに対し、EnumerateFilesメソッドはファイルが見つかると一旦呼び出し元に処理が戻ってきます。
これの何がいいのか?と言うと、フォルダ内にファイルが大量にあり検索に時間がかかる時にGetFilesを使うとすべてのファイルを検索してから処理が呼び出し元に返ってくるため検索中は処理が止まったように見えます。EnumerateFilesメソッドの場合はファイルが見つかると一旦処理が返ってくるため、待機時間が短くなります。
GetFilesメソッドを使ったファイル一覧の取得方法については、
フォルダ内のファイル名一覧を取得する(GetFiles)を見てください。
フォルダ内にあるファイル一覧を取得する
フォルダ内にあるファイル一覧を取得するには、
System.IO.Directory.EnumerateFilesメソッドの引数に検索するフォルダのパスを指定します。戻り値はファイルのパスが入ったstringの列挙可能型(IEnumerable<string>)です。引数を1つだけ指定した場合は、フォルダ内にあるファイルのみが検索対象になります。
using System;
using System.IO;
class Program
{
public static void Main()
{
// フォルダのパス
var dirPath = @"D:\source\repos\test\test";
// 指定したフォルダ内のファイル名一覧を取得する
foreach (string file in Directory.EnumerateFiles(dirPath)) {
Console.WriteLine(file);
}
}
}
こんな感じで各ファイルの絶対パスが返ってきます。
D:\source\repos\test\test\Class1.cs
D:\source\repos\test\test\Program.cs
D:\source\repos\test\test\test.csproj
ワイルドカードを使い取得するファイルを絞る
EnumerateFilesメソッドの第2引数にワイルドカードを使った検索パターンを指定することが出来ます。
第1引数には検索するフォルダのパスを指定します。
第2引数にはワイルドカードを使った検索パターンを指定します。
全てのファイルを対象にする場合「*」、
拡張子を指定する場合、「*.txt」、「*.cs」のように指定します。
戻り値は同じくファイルのパスが入ったstringの列挙可能型(IEnumerable<string>)です。
using System;
using System.IO;
class Program
{
public static void Main()
{
// フォルダのパス
var dirPath = @"D:\source\repos\test\test";
// 指定したフォルダ内からソースファイル(*.cs)を取得する
foreach (string file in Directory.EnumerateFiles(dirPath, "*.cs")) {
Console.WriteLine(file);
}
}
}
出力結果はこんな感じでcsファイルだけ取得することが出来ます。
D:\source\repos\test\test\Class1.cs
D:\source\repos\test\test\Program.cs
フォルダ内のサブフォルダを含めてファイルを検索する
EnumerateFilesメソッドの第3引数に検索オプション(指定フォルダ内のみ、サブフォルダも検索対象にする)を指定することが出来ます。
第1引数には検索するフォルダのパスを指定します。
第2引数にはワイルドカードを使った検索パターンを指定します。
第3引数に検索オプション(System.IO.SearchOption)を指定します。
検索オプションは以下の2つから選択します。
SearchOption.AllDirectories : 指定されたフォルダとサブフォルダ内のファイルが対象
SearchOption.TopDirectoryOnly : 指定されたフォルダ内のファイルが対象
using System;
using System.IO;
class Program
{
public static void Main()
{
// フォルダのパス
var dirPath = @"D:\source\repos\test\test";
// 指定したフォルダ内からソースファイル(*.cs)を取得する
foreach (string file in Directory.EnumerateFiles(dirPath, "*", SearchOption.AllDirectories)) {
Console.WriteLine(file);
}
}
}
出力結果は長いので省略します。
EnumerationOptionsを指定してサブフォルダを検索対象にする
EnumerateFilesメソッドの第3引数にEnumerationOptionsクラスを指定してサブフォルダを検索することもできます。
第3引数にあらかじめRecurseSubdirectoriesプロパティにtrueを設定したEnumerationOptionsクラスのインスタンスを渡します。
using System;
using System.IO;
class Program
{
public static void Main()
{
// フォルダのパス
var dirPath = @"D:\source\repos\test\test";
// 検索オプションの設定
var op = new EnumerationOptions {
// サブフォルダも対象にする
RecurseSubdirectories = true,
};
// 指定したフォルダとサブフォルダ内からファイル一覧を取得する
foreach (string file in Directory.EnumerateFiles(dirPath, "*", op)) {
Console.WriteLine(file);
}
}
}
他のEnumerationOptionsクラスのプロパティは以下になります。
プロパティ | 説明 | 規定値 |
---|---|---|
AttributesToSkip | スキップするファイルの属性を指定します | Hidden | System 隠しファイルとシステムファイルはスキップ |
BufferSize | 推奨されるバッファーサイズを指定します | 0 |
Ignorelnaccessible | ファイルにアクセス拒否された場合にスキップするかを指定します | true |
MatchCasing | 大文字と小文字の区別をどうするか | System.IO.MatchCasing.PlatformDefault プラットフォームに依存する |
MatchType | 使用するワイルドカードの種類を指定する | System.IO.MatchType.Simple *と?をワイルドカードとして使用 |
RecurseSubdirectories | サブフォルダを対象にするかを指定する | false しない |
ReturnSpecialDirectories | 特殊なディレクトリ「.」「..」を取得するかを指定する | false しない |
C# 記事まとめページに戻る(他のサンプルコードもこちら)
コメント