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

Завершено

.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 6.0. Убедитесь, что у вас установлена платформа .NET 6.0, выполнив следующую команду в удобном приложении терминала:

dotnet --list-sdks

Отобразятся выходные данные, аналогичные приведенным ниже.

3.1.100 [C:\program files\dotnet\sdk]
5.0.100 [C:\program files\dotnet\sdk]
6.0.100 [C:\program files\dotnet\sdk]

Убедитесь, что в списке есть версия, которая начинается с цифры 6. Если таких версий нет или эта команда не найдена, установите новейшую версию пакета SDK для .NET 6.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 net6.0 -n mslearn-dotnet-files -o .
    
  6. Выполните следующую команду, чтобы открыть новый проект .NET в том же экземпляре Visual Studio Code:

    code -a .
    

    Совет

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

    Screenshot showing the Visual Studio prompt that lets the user know something is missing from the project.

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

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

    Screenshot of EXPLORER window that shows the project folder structure.

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

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

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

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

    Screenshot of the Explorer window highlighting the program.cs file.

  2. Вставьте следующий код в первую строку файла Program.cs, чтобы импортировать пространства имен System.IO и System.Collections.Generic:

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

Примечание.

Начиная с .NET 6 две инструкции в приведенном выше коде автоматически включаются в новые проекты с помощью группы свойств ImplcitUsings. Так как мы указали флаг -f net6.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;
}