Упражнение. Работа с файловой системой

Завершено

.NET можно использовать для поиска и возврата сведений о файлах и папках.

Компания Tailwind Traders имеет множество физических магазинов по всему миру. Каждую ночь каждый магазин создает файл с именем sales.json , содержащий общую сумму всех продаж за этот день. Эти файлы упорядочены в папках с идентификатором хранилища.

Примечание.

В этом модуле используются .NET CLI (интерфейс командной строки) и Visual Studio Code для локальной разработки. После завершения этого модуля вы сможете применять основные приемы, изученные в этом модуле, в среде разработки Visual Studio (Windows) или Visual Studio для Mac (macOS) либо продолжить работу в Visual Studio Code (Windows, Linux и macOS).

В этом модуле используется пакет SDK для .NET 8.0. Убедитесь, что установлен .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. Если нет списка или команда не найдена, установите последний пакет SDK для .NET 8.0.

Клонирование проекта

В этом упражнении вы напишете программу .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. Выполните следующую команду, чтобы открыть новый проект .NET в том же экземпляре Visual Studio Code:

    code -a .
    

    Совет

    На этом этапе Visual Studio Code может предложить вам, что необходимые ресурсы для сборки и запуска проекта отсутствуют.

    Снимок экрана: сообщение Visual Studio, информирующее пользователя об отсутствии ресурсов для проекта.

    Нажмите треугольник с восклицательным знаком и выберите Перезапустить терминал, чтобы добавить файлы, позволяющие Visual Studio Code запускать и отлаживать проект.

  7. В окне обозревателя в разделе mslearn-dotnet-files разверните папку хранилища и каждую из нумерованных папок внутри.

    Снимок экрана: окно обозревателя, в котором показана структура папки проекта.

Поиск файлов sales.json

Следующие задачи создают программу для поиска всех sales.json файлов во всех папках mslearn-dotnet-files проекта.

Включение пространства имен System.IO

  1. В окне обозревателя выберите Program.cs файл, чтобы открыть его в редакторе.

    Снимок экрана: окно обозревателя, в котором выделен файл program.cs.

  2. Вставьте следующий код в первую строку файла 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.

  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.

В этом примере путь к каталогу магазинов был довольно простым и в рабочем каталоге программы. На следующем уроке вы узнаете, как с помощью класса 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;
}