练习 - 使用路径

已完成

.NET Path 类和 Directory.GetCurrentDirectory 是用于定义和编写文件系统路径的两种方法。

在上一练习中,你编写了一个程序,该程序循环访问文件夹以查找文件夹内或任何子文件夹内的任何“sales.json”文件。

在本练习中,你要使用 Path 类和 Directory.GetCurrentDirectory 来改进该程序,以便它能找到扩展名为 .json 的任何文件。

使用当前目录并合并路径

在当前的 Program.cs 代码中,需要传递“store”文件夹的静态位置。 现在,将该代码更改为使用 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(在 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 文件

此程序需要搜索扩展名为“.json”的任何文件,而不是只查找 sales.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;
}