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