演習 - パスを操作する
.NET の Path
クラスと Directory.GetCurrentDirectory
は、ファイル システムのパスを定義して構成する 2 つの方法です。
前の演習では、フォルダーを反復処理し、その中にある sales.json ファイルまたはサブフォルダーを検索するプログラムを記述しました。
この演習では、Path
クラスと Directory.GetCurrentDirectory
を使って、拡張子が .json である "すべての" ファイルを検索するようにプログラムを改良します。
現在のディレクトリを使用してパスを結合する
現在の Program.cs のコードを使用するときは、stores フォルダーの静的な場所を渡します。 ここでは、静的なフォルダー名を渡すのではなく、Directory.GetCurrentDirectory
の値を使用するようにこのコードを変更します。
エディターで、
Program.cs
ファイルの最初の行の上に次のコードを挿入します。 このコードでは、Directory.GetCurrentDirectory
メソッドを使用して現在のディレクトリのパスを取得し、新しい変数currentDirectory
に格納します。var currentDirectory = Directory.GetCurrentDirectory();
追加した行の後に次のコードを挿入します。 このコードでは、
Path.Combine
メソッドを使用して stores ディレクトリの完全なパスを作成し、新しい変数storesDirectory
に格納します。var storesDirectory = Path.Combine(currentDirectory, "stores");
FindFiles
関数呼び出しの文字列stores
を、新しい変数storesDirectory
で置き換えます。var salesFiles = FindFiles(storesDirectory);
これでファイルの先頭は次のスニペットのようになるはずです。
var currentDirectory = Directory.GetCurrentDirectory(); var storesDirectory = Path.Combine(currentDirectory, "stores"); var salesFiles = FindFiles(storesDirectory); foreach (var file in salesFiles) { Console.WriteLine(file); }
Ctrl+S (または macOS の場合は Cmd+S) キーを押して、ファイルを保存します。
コマンド ラインからプログラムを実行します。
dotnet run
プログラムによって、次の出力が表示されるはずです。
/home/username/dotnet-files/stores/sales.json /home/username/dotnet-files/stores/201/sales.json /home/username/dotnet-files/stores/202/sales.json /home/username/dotnet-files/stores/203/sales.json /home/username/dotnet-files/stores/204/sales.json
返されるファイル名に完全なシステム パスが含まれていることに注目してください。
Directory.GetCurrentDirectory
メソッドからは現在の場所への完全なパスが返されるため、このパスが含まれます。
すべての .json ファイルを見つける
このプログラムでは、sales.json ファイルだけを探すのではなく、拡張子が .json であるすべてのファイルを検索する必要があります。 これを行うには、Path.GetExtension
メソッドを使用して各ファイルの拡張子を確認できます。
foundFiles
を反復処理するforeach
ループで、if
ステートメントの上に次のコード行を挿入して新しい変数extension
を定義します。 このコードでは、Path.GetExtension
メソッドを使用して各ファイルの拡張子を取得します。var extension = Path.GetExtension(file);
if
ステートメントを変更し、次のコード行のようになるようにします。 このステートメントでは、ファイルの拡張子が .json と等しいかどうかを確認します。if (extension == ".json")
foreach
ループは次のコードのようになるはずです。foreach (var file in foundFiles) { var extension = Path.GetExtension(file); if (extension == ".json") { salesFiles.Add(file); } }
Ctrl+S / Cmd+S キーを押して、ファイルを保存します。
コマンド ラインからプログラムを実行します。
dotnet run
これで出力に、各店舗 ID ディレクトリ内のすべての .json ファイルが表示されるようになりました。
/home/username/dotnet-files/stores/sales.json /home/username/dotnet-files/stores/201/sales.json /home/username/dotnet-files/stores/201/salestotals.json /home/username/dotnet-files/stores/202/sales.json /home/username/dotnet-files/stores/202/salestotals.json /home/username/dotnet-files/stores/203/sales.json /home/username/dotnet-files/stores/203/salestotals.json /home/username/dotnet-files/stores/204/sales.json /home/username/dotnet-files/stores/204/salestotals.json
よくできました。 Path
クラスと Directory.GetCurrentDirectory
メソッドを使用して、プログラムの堅牢性を高めることができました。 次のユニットでは、ディレクトリを作成し、場所間でファイルを移動する方法について学習します。
行き詰まっていますか?
この演習のいずれかの時点で行き詰まった場合のために、完成したコードを次に示します。 Program.cs 内のすべてを削除し、次のソリューションに置き換えてください。
var currentDirectory = Directory.GetCurrentDirectory();
var storesDirectory = Path.Combine(currentDirectory, "stores");
var salesFiles = FindFiles(storesDirectory);
foreach (var file in salesFiles)
{
Console.WriteLine(file);
}
IEnumerable<string> FindFiles(string folderName)
{
List<string> salesFiles = new List<string>();
var foundFiles = Directory.EnumerateFiles(folderName, "*", SearchOption.AllDirectories);
foreach (var file in foundFiles)
{
var extension = Path.GetExtension(file);
if (extension == ".json")
{
salesFiles.Add(file);
}
}
return salesFiles;
}