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 делает все итераторы, ссылающиеся на элементы этого объекта, недействительными.
Если ОС использует нативный синтаксис, отличающийся от переносимого общего синтаксиса, описанного выше, функции библиотеки, определённые для принятия "обнаруженного формата", принимают имена путей в обоих форматах: аргумент обнаруженного формата считается имеющим общий формат только в том случае, если он соответствует общему формату, но не является приемлемым для операционной системы в качестве нативного пути. В тех ОС, где нативный формат отличается между именами путей каталогов и именами путей файлов, общий путь рассматривается как путь к каталогу, если он заканчивается на разделителе каталогов, и как обычный файл в противном случае.
В любом случае, класс пути ведёт себя так, как если бы он хранил имя пути в нативном формате и автоматически преобразовывал его в общий формат по мере необходимости (каждый метод указывает, какой формат он интерпретирует как путь).
В системах 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 с value_type типа path, удовлетворяющий всем требованиям LegacyBidirectionalIterator, за исключением того, что для двух равных доступных итераторов a и b типа const_iterator нет требования, что *a и *b ссылаются на один и тот же объект. Неопределено, является ли |
||||||||
iterator | псевдоним для const_iterator |
||||||||
|
(C++17) | определяет, как интерпретировать строковые представления имён путей. Также определены следующие перечисления:
(перечисление) |
Члены-константы
| constexpr value_type preferred_separator
[static] | альтернативный разделитель каталогов, который может использоваться дополнительно к переносимому /. В Windows это обратная косая черта \. В POSIX это та же косая черта /, что и переносимый разделитель (общедоступная статическая константа-член) |
Члены-функции
создаёт path (публичный член-функция) |
|
уничтожает объект path (публичный член-функция) |
|
| присваивает другой путь (публичный член-функция) |
|
| присваивает содержимое (публичный член-функция) |
|
Конкатенация |
|
| добавляет элементы в путь с разделителем каталогов (публичный член-функция) |
|
| конкатенирует два пути без введения разделителя каталогов (публичный член-функция) |
|
Модификаторы |
|
| очищает содержимое (публичный член-функция) |
|
| преобразует разделители каталогов в предпочтительный разделитель каталогов (публичный член-функция) |
|
| удаляет компонент имени файла пути (публичный член-функция) |
|
| заменяет последний компонент пути другим путём (публичный член-функция) |
|
| заменяет расширение (публичный член-функция) |
|
| меняет местами два пути (публичный член-функция) |
|
Наблюдатели формата |
|
| возвращает родную версию пути (публичный член-функция) |
|
| возвращает путь в формате родного имени файла, преобразованного в строку (публичный член-функция) |
|
| возвращает путь в формате универсального имени файла, преобразованного в строку (публичный член-функция) |
|
Сравнение |
|
| сравнивает лексические представления двух путей лексикографически (публичный член-функция) |
|
Генерация |
|
| преобразует путь в нормальную форму преобразует путь в относительную форму преобразует путь в приблизительную форму (публичный член-функция) |
|
Декомпозиция |
|
| возвращает имя корня пути, если оно есть (публичный член-функция) |
|
| возвращает корневой каталог пути, если он есть (публичный член-функция) |
|
| возвращает корневой путь пути, если он есть (публичный член-функция) |
|
| возвращает путь относительно корневого пути (публичный член-функция) |
|
| возвращает путь родительского пути (публичный член-функция) |
|
| возвращает компонент имени файла пути (публичный член-функция) |
|
| возвращает компонент пути стема (имя файла без окончательного расширения) (публичный член-функция) |
|
| возвращает компонент пути расширения файла (публичный член-функция) |
|
Запросы |
|
| проверяет, пуст ли путь (публичный член-функция) |
|
| проверяет, соответствует ли соответствующий элемент пути непустому значению (публичный член-функция) |
|
проверяет, однозначно ли root_path() указывает на местоположение файловой системы (публичный член-функция) |
|
Итераторы |
|
| доступ к итератору к пути как к последовательности элементов (публичный член-функция) |
|
Нечленные функции
Определено в пространстве имен std::filesystem |
|
|---|---|
|
(C++17) | меняет местами два пути (функция) |
|
(C++17) | вычисляет значение хеша для объекта пути (функция) |
|
(C++17)(C++17)(до C++20)(C++17)(до C++20)(C++17)(до C++20)(C++17)(до C++20)(C++17)(до C++20)(C++20) | лексикографически сравнивает два пути (функция) |
|
(C++17) | конкатенирует два пути с разделителем каталога (функция) |
|
(C++17) | выполняет потоковый ввод-вывод для пути в кавычках (функция) |
|
(C++17)(устарело в C++20) | создаёт path из UTF-8 кодированного источника (функция) |
Вспомогательные классы
Определено в пространстве имен std |
|
|---|---|
|
(C++17) | поддержка хеширования для std::filesystem::path (специализация шаблона класса) |
Отчеты об ошибках
Следующие отчеты об ошибках, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применено к | Поведение как опубликовано | Корректное поведение |
|---|---|---|---|
| LWG 3657 | C++17 |
hash для path было отключено | включено |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/filesystem/path