Работа с путями к файлам в .NET
В .NET имеется встроенный механизм для работы с путями в файловой системе.
В предыдущем упражнении у нас было не так много папок для анализа. При наличии файловой системы, содержащей множество файлов и папок, создание путей вручную может быть утомительным. К счастью, в .NET есть ряд встроенных констант и служебных функций, упрощающих работу с путями к файлам.
Здесь вы узнаете о некоторых константах и служебных функциях в System.IO пространстве имен и System.Environment типе, чтобы сделать программу более гибкой и более устойчивой.
Определение текущего каталога
Иногда каталог или путь выполнения программы неизвестны. Предположим, что вы хотите, чтобы программа использовала текущий каталог, но не знаете путь.
.NET предоставляет полный путь к текущему каталогу с помощью метода Directory.GetCurrentDirectory.
Console.WriteLine(Directory.GetCurrentDirectory());
Если вы запускаете предыдущий код из папки 201 в следующей структуре, Directory.GetCurrentDirectory() возвращается stores\201:
📂 stores
📂 201
Работа со специальными каталогами
.NET может работать везде: в Windows, macOS, Linux и даже в мобильных операционных системах, таких как iOS и Android. Каждая операционная система может иметь или не может иметь концепцию специальных системных папок (например, домашнего каталога, выделенного для файлов, относящихся к пользователям, или классического каталога или каталога для хранения временных файлов).
Эти типы специальных каталогов различаются в разных операционных системах. Было бы неудобно пытаться запомнить структуру каталогов каждой операционной системы и выполнять ветвление в зависимости от текущей ОС.
В перечислении System.Environment.SpecialFolder содержатся константы для получения путей к специальным системным папкам.
Следующий код возвращает путь к эквиваленту папки Windows My Documents или каталога HOME пользователя для любой операционной системы, даже если код выполняется в Linux:
string docPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
Работа с путями
Пути используются так часто, что в .NET есть класс Path, специально предназначенный для работы с ними.
Класс Path находится в пространстве имен System.IO в .NET, и не требует установки.
Специальные символы пути
Разные операционные системы используют разные символы для разделения уровней каталогов.
Например, в Windows используется обратная косая черта (stores\201), а в macOS — прямая косая черта (stores/201).
Чтобы обеспечить использование правильного символа, класс Path содержит поле DirectorySeparatorChar.
.NET автоматически интерпретирует это поле в знак разделения, который зависит от используемой операционной системы, если требуется создать путь вручную.
Console.WriteLine($"stores{Path.DirectorySeparatorChar}201");
// returns:
// stores\201 on Windows
//
// stores/201 on macOS
Объединение путей
Класс Path работает с концепцией путей к файлам и папкам, которые являются обычными строками. Вы можете использовать класс Path для автоматического создания корректных путей в конкретной операционной системе.
Например, если нужно получить путь к папке stores/201, можно использовать функцию Path.Combine.
Console.WriteLine(Path.Combine("stores","201")); // outputs: stores/201
Помните, что вместо строк жесткого программирования следует использовать Path.Combine или Path.DirectorySeparatorChar класс, так как программа может работать в различных операционных системах. Класс Path всегда форматирует пути для операционной системы, в которой она работает.
Совет
Классу Path не важно, существуют ли объекты на самом деле. Пути являются концептуальными, а не физическими, и класс создает и анализирует строки за вас.
Определение расширений имен файлов
Класс Path также может указывать расширение имени файла. Если у вас есть файл и нужно выяснить, является ли он файлом JSON, вы можете использовать функцию Path.GetExtension.
Console.WriteLine(Path.GetExtension("sales.json")); // outputs: .json
Получение необходимых сведений о файле или пути
Класс Path содержит множество различных методов, которые выполняют различные действия. Большинство сведений о каталоге или файле можно получить с помощью классов DirectoryInfo и FileInfo соответственно.
string fileName = $"stores{Path.DirectorySeparatorChar}201{Path.DirectorySeparatorChar}sales{Path.DirectorySeparatorChar}sales.json";
FileInfo info = new FileInfo(fileName);
Console.WriteLine($"Full Name: {info.FullName}{Environment.NewLine}Directory: {info.Directory}{Environment.NewLine}Extension: {info.Extension}{Environment.NewLine}Create Date: {info.CreationTime}"); // And many more
Существуют гораздо более полезные свойства и служебные методы в Pathклассах DirectoryInfo, но FileInfo эти основные понятия являются наиболее часто используемыми. В следующем упражнении вы создадите пути и определите файлы JSON.