Работа с путями к файлам в .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.