演習 - ファイル システムを操作する

完了

.NET を使用すると、ファイルとフォルダーに関する情報を検索して取得することができます。

Tailwind Traders は、世界中に多数の実店舗を持っています。 各店舗では、毎晩、その日のすべての売上の合計を含む "sales.json" という名前のファイルが作成されます。 これらのファイルは、店舗 ID を名前とするフォルダーに整理されています。

Note

このモジュールでは、ローカル開発に .NET CLI (コマンド ライン インターフェイス)Visual Studio Code を使用します。 このモジュールを完了した後、Visual Studio (Windows)、Visual Studio for Mac (macOS)、または Visual Studio Code (Windows、Linux、および macOS) での継続的開発などの開発環境を使用して、学習したその概念を適用できます。

このモジュールでは、.NET 8.0 SDK を使います。 適切なコマンド ターミナルで次のコマンドを実行して、.NET 8.0 がインストールされていることを確認します。

dotnet --list-sdks

次の例のような出力が表示されます。

6.0.317 [C:\Program Files\dotnet\sdk]
7.0.401 [C:\Program Files\dotnet\sdk]
8.0.100 [C:\Program Files\dotnet\sdk]

8 で始まるバージョンが一覧に表示されていることを確実にします。 何も表示されない場合、またはコマンドが見つからない場合は、最新の .NET 8.0 SDK をインストールしてください。

プロジェクトをクローンする

この演習では、"sales.json" という名前のファイルをディレクトリとそのサブディレクトリで検索する .NET プログラムを作成します。

スタート プロジェクトは既に自動的に作成されています。 Visual Studio Code の統合ターミナルを使用して、それをクローンします。

  1. Visual Studio Code を開きます。

  2. メイン メニューで、[表示]>[ターミナル] を選んでターミナル ウィンドウを開きます。

  3. (省略可能) ターミナル ウィンドウで、ファイルのコピー先のディレクトリ (c:\MyProjects など) に移動します。

  4. ターミナル ウィンドウで、次のコマンドを実行してスターター プロジェクトをクローンし、クローンしたプロジェクトに移動します。

    git clone https://github.com/MicrosoftDocs/mslearn-dotnet-files && cd mslearn-dotnet-files
    
  5. 次のコマンドを実行して、新しい .NET コンソール プロジェクトを作成します。

    dotnet new console -f net8.0 -n mslearn-dotnet-files -o .
    
  6. 次のコマンドを実行して、Visual Studio Code の同じインスタンスで新しい .NET プロジェクトを開きます。

    code -a .
    

    ヒント

    この時点で、プロジェクトのビルドと実行に必要な資産が見つからないというメッセージが Visual Studio Code で表示される場合があります。

    Visual Studio でプロジェクトに不足しているものがあることをユーザーに知らせるプロンプトが表示されているスクリーンショット。

    中に感嘆符がある三角形を選択してから、[Relaunch terminal](ターミナルの再起動) を選択し、Visual Studio Code でプロジェクトを実行およびデバッグできるようにするファイルを追加します。

  7. エクスプローラー ウィンドウで、mslearn-dotnet-files の下の stores フォルダーと、その中にある番号の付いた各フォルダーを展開します。

    プロジェクト フォルダーの構造が示されているエクスプローラー ウィンドウのスクリーンショット。

sales.json ファイルを検索する

次のタスクでは、mslearn-dotnet-files プロジェクトのすべてのフォルダー内のすべての sales.json ファイルを検索するプログラムを作成します。

System.IO 名前空間を含める

  1. エクスプローラー ウィンドウで、Program.cs ファイルを選んでエディターで開きます。

    program.cs ファイルが強調表示されているエクスプローラー ウィンドウのスクリーンショット。

  2. Program.cs ファイルの最初の行に次のコードを貼り付けて、System.IO および System.Collections.Generic 名前空間をインポートします。

    using System.IO;
    using System.Collections.Generic;
    

Note

.NET 6 以降では、前記のコードの 2 つのステートメントは、ImplcitUsings プロパティ グループを介して新しいプロジェクトに自動的に組み込まれます。 新しいコンソール プロジェクトを作成するときに -f net8.0 フラグを指定したので、それらは暗黙的に追加されます。 ただし、古いプロジェクトを使用している場合は、Program.cs ファイルに含める必要があります。ファイルに残しても、このプロジェクトには影響しません。

sales.json ファイルを検索する関数を記述する

folderName パラメーターを受け取る FindFiles という新しい関数を作成します。

  1. Console.WriteLine("Hello, World!"); という行を次のコードに置き換えます。

    IEnumerable<string> FindFiles(string folderName)
    {
        List<string> salesFiles = new List<string>();
    
        var foundFiles = Directory.EnumerateFiles(folderName, "*", SearchOption.AllDirectories);
    
        foreach (var file in foundFiles)
        {
            // The file name will contain the full path, so only check the end of it
            if (file.EndsWith("sales.json"))
            {
                salesFiles.Add(file);
            }
        }
    
        return salesFiles;
    }
    
  2. FindFiles 関数を呼び出すために、using ステートメントの下に次のコードを挿入します。 このコードでは、ファイルの検索場所として、stores フォルダーの名前を渡します。

    var salesFiles = FindFiles("stores");
    
    foreach (var file in salesFiles)
    {
        Console.WriteLine(file);
    }
    
  3. Ctrl + S (または macOS の場合は Cmd + S) キーを押して、Program.cs ファイルを保存します。

プログラムを実行する

  1. ターミナル ウィンドウで次のコマンドを入力して、プログラムを実行します。

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

    stores/sales.json
    stores/201/sales.json
    stores/202/sales.json
    stores/203/sales.json
    stores/204/sales.json
    

お疲れ様でした。 これで stores ディレクトリ内のすべてのフォルダーをスキャンし、見つかったすべての sales.json ファイルを一覧表示するコマンドライン プログラムが正常に作成されました。

この例では、stores ディレクトリへのパスが比較的単純で、プログラムの作業ディレクトリにありました。 次のユニットでは、Path クラスを使用して、オペレーティング システム全体で機能する複雑な構造を構築する方法を学習します。

行き詰まっていますか?

プログラムの実行で問題が発生した場合のために、Program.cs ファイルの完成したコードを次に示します。 Program.cs ファイルの内容をこのコードに置き換えます。

var salesFiles = FindFiles("stores");
    
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)
    {
        // The file name will contain the full path, so only check the end of it
        if (file.EndsWith("sales.json"))
        {
            salesFiles.Add(file);
        }
    }

    return salesFiles;
}