練習 - 使用路徑

已完成

.NET Path 類別和 Directory.GetCurrentDirectory 是定義及撰寫檔案系統路徑的兩種方式。

在上一個練習中,您撰寫了程式,其可逐一查看資料夾,以找出其中 (或任何子資料夾中) 的所有 sales.json 檔案。

在本練習中,您可使用 Path 類別與 Directory.GetCurrentDirectory 來改善該程式,讓其能夠找到具有 .json 副檔名的所有檔案。

使用目前目錄並合併路徑

在目前的 Program.cs 程式碼中,您正在傳遞 stores 資料夾的靜態位置。 現在,我們將變更該程式碼以使用 Directory.GetCurrentDirectory 值,而非傳遞靜態資料夾名稱。

  1. 在編輯器中,於 Program.cs 檔案的第一行上方插入下列程式碼。 此程式碼會使用 Directory.GetCurrentDirectory 方法來取得目前目錄的路徑,並將其儲存在新的變數 currentDirectory 中:

    var currentDirectory = Directory.GetCurrentDirectory();
    
  2. 在剛才新增的程式碼後面插入下列程式碼。 此程式碼會使用 Path.Combine 方法來建立存放區目錄的完整路徑,並將其儲存在新的變數 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 (或 Cmd+S macOS) 可儲存檔案。

  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
    

    現在輸出會顯示每個存放區識別碼目錄中的所有.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;
}