演習 - パスを操作する
.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");stores関数呼び出しの文字列FindFilesを、新しい変数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 (または Cmd + S macOS) キーを押してファイルを保存します。
コマンド ラインからプログラムを実行します。
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 メソッドを使用して各ファイルの拡張子を確認できます。
foreachを反復処理するfoundFilesループで、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;
}