Упражнение. Работа с путями
Класс Path
и функция Directory.GetCurrentDirectory
в .NET — это два способа определения и создания путей файловой системы.
В предыдущем упражнении вы написали программу, которая выполняет перебор содержимого папки и всех ее вложенных папок и находит в ней все файлы sales.json.
В этом упражнении вы используете Path
класс и Directory.GetCurrentDirectory
улучшаете программу, чтобы найти любой файл с расширением .json.
Использование текущего каталога и объединение путей
В текущем коде файла Program.cs передается статическое расположение папки stores. Теперь мы изменим этот код, чтобы использовать Directory.GetCurrentDirectory
значение вместо передачи имени статической папки.
В редакторе вставьте следующий код перед первой строкой файла
Program.cs
. Этот код использует методDirectory.GetCurrentDirectory
, чтобы получить путь к текущему каталогу и сохранить его в новой переменнойcurrentDirectory
:var currentDirectory = Directory.GetCurrentDirectory();
Вставьте следующий код после только что добавленной строки. Этот код использует метод
Path.Combine
, чтобы создать полный путь к каталогу stores и сохранить его в новой переменнойstoresDirectory
:var storesDirectory = Path.Combine(currentDirectory, "stores");
Замените строку
stores
в вызовеFindFiles
функции новой переменной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); }
Нажмите CTRL + S (или CMD + S в macOS), чтобы сохранить файл.
Запустите программу из командной строки:
dotnet run
Программа должна возвратить следующие выходные данные:
/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-файлов
Вместо поиска только файлов sales.json программа должна искать все файлы с расширением JSON. Для этого можно использовать Path.GetExtension
метод для проверки расширения для каждого файла.
В цикле
foreach
, который выполняет итерациюfoundFiles
, вставьте следующую строку кода надif
инструкцией, чтобы определить новую переменнуюextension
. Этот код использует методPath.GetExtension
для получения расширения каждого файла.var extension = Path.GetExtension(file);
Измените инструкцию
if
так, чтобы она стала похожа на следующую строку кода. Эта инструкция проверяет, равно ли расширение файла JSON.if (extension == ".json")
Цикл
foreach
должен выглядеть примерно так, как показано в следующем коде:foreach (var file in foundFiles) { var extension = Path.GetExtension(file); if (extension == ".json") { salesFiles.Add(file); } }
Нажмите клавиши CTRL+S / CMD+S, чтобы сохранить файл.
Запустите программу из командной строки:
dotnet run
Теперь в выходных данных отображаются все файлы .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;
}