练习 - 使用文件系统
可以使用 .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 中的集成终端克隆它。
打开 Visual Studio Code。
在主菜单中,选择“视图”“终端”打开终端窗口>。
(可选)在终端窗口中,更改为要将文件复制到的目录,例如
c:\MyProjects
。在终端窗口中,运行以下命令克隆初学者项目并转到克隆的项目:
git clone https://github.com/MicrosoftDocs/mslearn-dotnet-files && cd mslearn-dotnet-files
运行以下命令以创建新的 .NET 控制台项目:
dotnet new console -f net8.0 -n mslearn-dotnet-files -o .
运行以下命令,在同一个 Visual Studio Code 实例中打开新的 .NET 项目:
code -a .
提示
此时 Visual Studio Code 可能会提示你生成和运行该项目所需的资产已丢失。
选择带有感叹号的三角形,然后选择“重新启动终端”,添加允许 Visual Studio Code 运行和调试项目的文件。
在资源管理器窗口中的“mslearn-dotnet-files”下,展开“stores”文件夹和其中每个带编号的文件夹。
查找 sales.json 文件
以下任务创建一个程序,用于查找 mslearn-dotnet-files
项目的所有文件夹中的所有 sales.json 文件。
包含 System.IO 命名空间
在资源管理器窗口中,选择
Program.cs
文件以在编辑器中打开它。将以下代码粘贴到
Program.cs
文件的第一行,导入System.IO
和System.Collections.Generic
命名空间:using System.IO; using System.Collections.Generic;
注意
从 .NET 6 开始,上述代码中的两个语句会自动通过 ImplcitUsings
属性组包含在新项目中。 因为我们在创建新的控制台项目时指定了 -f net8.0
标志,所以它们将被隐式添加。 但是,如果使用的是较旧的项目,则需要将其包含在 Program.cs
文件中,如果将其保留在该文件中,就不会影响此项目。
编写用于查找 sales.json 文件的函数
创建一个名为 FindFiles
的新函数,该函数采用 folderName
参数。
将 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; }
在
using
语句下面插入以下代码以调用FindFiles
函数。 此代码会传入“stores”文件夹名称作为文件的搜索位置。var salesFiles = FindFiles("stores"); foreach (var file in salesFiles) { Console.WriteLine(file); }
按 Ctrl+S (或 Cmd+S macOS)保存
Program.cs
文件。
运行程序
在终端窗口中输入以下命令以运行程序:
dotnet run
程序应显示以下输出:
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;
}