练习 - 使用文件系统

已完成

可以使用 .NET 查找并返回有关文件和文件夹的信息。

Tailwind Traders 在世界各地有许多实体商店。 每天晚上,每个商店都要创建一个名为 sales.json 的文件,其中包含当天所有销售额的总计。 这些文件在使用商店 ID 命名的文件夹中进行组织。

注意

本模块使用 .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

克隆项目

在本练习中,请编写一个 .NET 程序,用于在目录及其子目录中搜索名为 sales.json 的文件。

我们已为你创建了一个初学者项目。 请使用 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 提示符的屏幕截图,允许用户知道项目中缺少的内容。

    选择带有感叹号的三角形,然后选择“重新启动终端”,添加允许 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.IOSystem.Collections.Generic 命名空间:

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

注意

从 .NET 6 开始,上述代码中的两个语句会自动通过 ImplcitUsings 属性组包含在新项目中。 因为我们在创建新的控制台项目时指定了 -f net8.0 标志,所以它们将被隐式添加。 但是,如果使用的是较旧的项目,则需要将其包含在 Program.cs 文件中,如果将其保留在该文件中,就不会影响此项目。

编写用于查找 sales.json 文件的函数

创建一个名为 FindFiles 的新函数,该函数采用 folderName 参数。

  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. using 语句下面插入以下代码以调用 FindFiles 函数。 此代码会传入“stores”文件夹名称作为文件的搜索位置。

    var salesFiles = FindFiles("stores");
    
    foreach (var file in salesFiles)
    {
        Console.WriteLine(file);
    }
    
  3. Ctrl+S (或 Cmd+S macOS)保存 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;
}