std::std::filesystem::path
Определено в заголовочном файле <filesystem> | ||
class path; | (начиная с C++17) | |
Объекты класса path
представляют собой путевые имена файловой системы. При этом обрабатывается только синтаксическая корректность путей: путевое имя может описывать несуществующий путь или вовсе быть недопустимым в данной файловой или операционной системе (ОС).
Путевые имена обладают следующим синтаксисом:
- корневое-имя(необязательно): обозначает корень файловой системы с несколькими корнями (такие как C: или //myserver). В случае неоднозначности наиболее длинная последовательность символов, образующая корректное корневое-имя, воспринимается как корневое-имя. Стандартная библиотека может определять дополнительные корневые имена помимо тех, что доступны через API ОС.
- корневой-каталог(необязательно): разделитель каталогов, в случае присутствия которого путь считается абсолютным. Если же он отсутствует (и первый элемент, отличный от корневого имени, является именем файла), то путь считается относительным и требует другой путь в качестве начального положения для определения имени файла.
- Произвольное количество следующих элементов:
- имя-файла: последовательность символов, не являющаяся разделителем каталогов или предпочтительным разделителем каталогов (файловая и операционная системы могут накладывать дополнительные ограничения). Это имя может обозначать файл, жесткую ссылку, символическую ссылку или каталог. Распознаются два специальных имени-файла:
- точка: имя файла, состоящее из одного символа точки ., является именем каталога, который ссылается на текущий каталог.
- две-точки: имя файла, состоящее из двух символов точки .., является именем каталога, который ссылается на родительский каталог.
- разделитель-каталогов: символ косой черты / или альтернативный символ, определенный как предпочтительный разделитель
path::preferred_separator
. Если данный символ повторяется несколько раз, то рассматривается как один разделитель каталогов: /usr///////lib эквивалентно /usr/lib.
Путь может быть нормализован с помощью следующего алгоритма:
- Если путь пуст, завершить (нормальная форма пустого пути — это пустой путь).
- Заменить каждый разделитель-каталогов (который может состоять из нескольких символов косой черты) одним предпочтительным разделителем каталогов
path::preferred_separator
. - Заменить каждый символ косой черты в корневом-имени предпочтительным разделителем каталогов
path::preferred_separator
. - Удалить каждый символ точки вместе с разделитем-каталогов, который следует непосредственно за ним.
- Удалить каждое имя файла, отличное от двух-точек, за которым следуют разделитель-каталогов и две-точки, а также любой следующий непосредственно за ним разделитель-каталогов.
- Если присутствует корневой-каталог, удалить все две-точки вместе с любым разделителем-каталогов, следующим непосредственно за ними.
- Если последнее имя файла — две-точки, удалить любой завершающий разделитель-каталогов.
- Если путь пуст, добавить точку (нормальная форма пути ./ — это путь .).
Путь можно обойти поэлементно с помощью итераторов, возвращаемых функциями begin() и end(), которые представляют путь в обобщенном формате и проходят по корневому имени, корневому каталогу и последующим именам файлов (разделители каталогов пропускаются, исключая тот, что обозначает корневой каталог). Если самым последним элементом пути является разделитель каталогов, результатом разыменования последнего итератора будет пустой элемент.
Вызов любой неконстантной функции-члена класса path
делает недействительными все итераторы, ссылающиеся на элементы этого объекта.
Если ОС использует нативный синтаксис, который отличается от описанного выше портируемого обобщенного синтаксиса, библиотечные функции, способные определять формат, принимают путевые имена в обоих форматах: аргумент определенного формата рассматривается как обобщенный путь тогда и только тогда, когда он соответствует обобщенному формату и недопустим в качестве нативного пути для данной операционной системы. На тех ОС, где нативный формат путевых имен различается для каталогов и для файлов, обобщенный путь рассматривается как каталог, если оканчивается на разделитель каталогов, и как обычный файл в других случаях.
В любом случае объекты класса path
ведут себя так, будто они хранят путевые имена в нативном формате и автоматически преобразуют их в обобщенный формат при необходимости (каждая функция-член указывает, в каком формате она интерпретирует путь).
На POSIX-совместимых системах обобщенный формат также является нативным форматом, и потому нет необходимости различать или преобразовывать их между собой.
Пути неявно преобразуются в строковый тип std::basic_string и наоборот, что позволяет использовать их с другими файловыми API.
Потоковый оператор вывода использует std::quoted, поэтому пробельные символы не вызывают усечения путевого имени, если оно впоследствии читается с помощью потокового оператора ввода.
Функции-члены декомпозиции (например, extension) возвращают объект класса filesystem::path
вместо строковых типов, в отличие от других API.
Содержание |
[править]Типы-члены
Тип | Определение | ||||||||||
value_type | строковый тип, используемый в нативной кодировке файловой системы: char в POSIX, wchar_t в Windows | ||||||||||
string_type | std::basic_string<value_type> | ||||||||||
const_iterator | константный LegacyInputIterator с типом path в качестве value_type , удовлетворяющий требованиям LegacyBidirectionalIterator, однако для двух одинаковых итераторов a и b типа const_iterator , к которым применяется операция разыменования, не предъявляется требования, чтобы *a и *b ссылались на один и тот же объект. Не уточняется, в является ли | ||||||||||
iterator | псевдоним для const_iterator | ||||||||||
(C++17) | определяет, как интерпретировать строковое представление путевых имен. Также определены следующие элементы перечисления:
(перечисление) |
[править]Константы-члены
constexpr value_type preferred_separator [static] | альтернативный разделитель каталогов, который может использоваться в дополнение к переносимому символу косой черты /. В Windows это символ обратной косой черты \. В POSIX это тот же символ косой черты /, что и переносимый разделитель каталогов (public static константа-элемент) |
[править]Функции-члены
создаёт path (public функция-элемент) | |
уничтожает объект path (public функция-элемент) | |
назначает другой путь (public функция-элемент) | |
присваивает содержимое (public функция-элемент) | |
Конкатенация | |
добавляет элементы к пути с разделителем каталогов (public функция-элемент) | |
объединяет два пути без введения разделителя каталогов (public функция-элемент) | |
Модификация | |
стирает содержимое (public функция-элемент) | |
преобразует разделитель каталогов в предпочтительный разделитель каталогов (public функция-элемент) | |
Удаляет компонент пути к имени файла (public функция-элемент) | |
заменяет компонент последнего пути другим (public функция-элемент) | |
заменяет расширение (public функция-элемент) | |
обменивает два пути (public функция-элемент) | |
Форматирование | |
возвращает собственную версию пути (public функция-элемент) | |
возвращает путь в формате преобразованный в строку (public функция-элемент) | |
возвращает путь в формате универсального имени пути, преобразованный в строку (public функция-элемент) | |
Сравнение | |
лексикографическое сравнение двух путей (public функция-элемент) | |
Генерация | |
преобразует путь в нормальную форму преобразует путь в относительную форму преобразует путь в проксимальную форму (public функция-элемент) | |
Декомпозиция | |
возвращает имя корня пути, если имеется (public функция-элемент) | |
возвращает корневой каталог пути, если он существует (public функция-элемент) | |
возвращает путь к корню пути, если он существует (public функция-элемент) | |
возвращает путь относительно корневого пути (public функция-элемент) | |
Возвращает путь родительского пути (public функция-элемент) | |
возвращает компонент пути к имени файла (public функция-элемент) | |
возвращает компонент пути к основанию (public функция-элемент) | |
возвращает компонент пути расширения файла (public функция-элемент) | |
Запросы | |
проверяет, является ли путь пустым (public функция-элемент) | |
проверяет, не является ли соответствующий элемент пути пустым (public функция-элемент) | |
проверяет, однозначно ли root_path() идентифицирует местоположение в файловой системе (public функция-элемент) | |
Итераторы | |
доступ итератора к пути в виде последовательности элементов (public функция-элемент) |
[править]Функции, не являющиеся членами
Определены в пространстве имён std::filesystem | |
(C++17) | меняет местами два пути (функция) |
(c++17) | вычисляет хеш-значение для объекта path (функция) |
(C++17)(C++17)(до C++20)(C++17)(до C++20)(C++17)(до C++20)(C++17)(до C++20)(C++17)(до C++20)(C++20) | выполняет лексикографическое сравнение двух путей (функция) |
[править]Вспомогательные классы
Определены в пространстве имён std | |
поддержка хэширования для std::filesystem::path (специализация шаблона класса) | |
поддержка форматирования для std::filesystem::path (специализация шаблона класса) |
[править]Отчёты об ошибках
Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:
Номер | Применён | Поведение в стандарте | Корректное поведение |
---|---|---|---|
LWG 3657 | C++17 | std::hash для path была отключена | включена |