Упражнение. Работа с путями
Класс 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;
}