演習 - パスを操作する

完了

.NET の Path クラスと Directory.GetCurrentDirectory は、ファイル システムのパスを定義して構成する 2 つの方法です。

前の演習では、フォルダーを反復処理し、その中にある sales.json ファイルまたはサブフォルダーを検索するプログラムを記述しました。

この演習では、Path クラスと Directory.GetCurrentDirectory を使って、拡張子が .json である "すべての" ファイルを検索するようにプログラムを改良します。

現在のディレクトリを使用してパスを結合する

現在の Program.cs のコードを使用するときは、stores フォルダーの静的な場所を渡します。 ここでは、静的なフォルダー名を渡すのではなく、Directory.GetCurrentDirectory の値を使用するようにこのコードを変更します。

  1. エディターで、Program.cs ファイルの最初の行の上に次のコードを挿入します。 このコードでは、Directory.GetCurrentDirectory メソッドを使用して現在のディレクトリのパスを取得し、新しい変数 currentDirectory に格納します。

    var currentDirectory = Directory.GetCurrentDirectory();
    
  2. 追加した行の後に次のコードを挿入します。 このコードでは、Path.Combine メソッドを使用して stores ディレクトリの完全なパスを作成し、新しい変数 storesDirectory に格納します。

    var storesDirectory = Path.Combine(currentDirectory, "stores");
    
  3. 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);
    }
    
  4. Ctrl+S (または macOS の場合は Cmd+S) キーを押して、ファイルを保存します。

  5. コマンド ラインからプログラムを実行します。

    dotnet run
    
  6. プログラムによって、次の出力が表示されるはずです。

    /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 メソッドを使用して各ファイルの拡張子を確認できます。

  1. foundFiles を反復処理する foreach ループで、if ステートメントの上に次のコード行を挿入して新しい変数 extension を定義します。 このコードでは、Path.GetExtension メソッドを使用して各ファイルの拡張子を取得します。

        var extension = Path.GetExtension(file);
    
  2. if ステートメントを変更し、次のコード行のようになるようにします。 このステートメントでは、ファイルの拡張子が .json と等しいかどうかを確認します。

           if (extension == ".json")
    

    foreach ループは次のコードのようになるはずです。

    foreach (var file in foundFiles)
    {
        var extension = Path.GetExtension(file);
        if (extension == ".json")
        {
            salesFiles.Add(file);
        }
    }
    
  3. Ctrl+S / Cmd+S キーを押して、ファイルを保存します。

  4. コマンド ラインからプログラムを実行します。

    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;
}