std::filesystem::path
Определён в заголовочном файле <filesystem> | ||
|---|---|---|
class path; | (начиная с C++17) |
Объекты типа path представляют пути в файловой системе. Обрабатываются только синтаксические аспекты путей: имя пути может обозначать несуществующий путь или даже путь, существование которого не допускается в текущей файловой системе или ОС.
Имя пути имеет следующий синтаксис:
-
root-name(необязательно): задаёт корень в файловой системе с несколькими корнями (например,
"C:"или"//myserver"). В случае неоднозначности последовательность символов наибольшей длины, образующая допустимое root-name, считается root-name. Стандартная библиотека может определять дополнительные корневые имена, помимо тех, которые распознаются API операционной системы. - root-directory(необязательно): разделитель каталогов, наличие которого указывает, что путь является абсолютным. Если он отсутствует (и первый элемент после корневого имени является именем файла), путь является относительным и для разрешения в имя файла ему требуется другой путь в качестве начального расположения.
- Ноль или более следующих элементов:
- file-name: последовательность символов, не являющихся разделителями каталогов или предпочтительными разделителями каталогов (ОС или файловая система могут накладывать дополнительные ограничения). Это имя может обозначать файл, жёсткую ссылку, символическую ссылку или каталог. Распознаются два специальных значения file-name:
-
dot: имя файла, состоящее из одного символа точки
., является именем каталога, обозначающим текущий каталог. -
dot-dot: имя файла, состоящее из двух символов точки
.., является именем каталога, обозначающим родительский каталог. -
directory-separator: символ прямой косой черты
/или альтернативный символ, задаваемый какpath::preferred_separator. Если этот символ повторяется, он считается одним разделителем каталогов:/usr///////libэквивалентно/usr/lib.
Путь можно нормализовать по следующему алгоритму:
- Если путь пуст, остановиться (нормальная форма пустого пути — пустой путь).
- Заменить каждый directory-separator (который может состоять из нескольких косых черт) одним символом
path::preferred_separator. - Заменить каждый символ косой черты в root-name на
path::preferred_separator. - Удалить каждую dot и любой непосредственно следующий за ней directory-separator.
- Удалить каждое имя файла, не являющееся dot-dot, за которым непосредственно следуют directory-separator и dot-dot, а также любой непосредственно следующий за ними directory-separator.
- Если имеется root-directory, удалить все dot-dot и любые непосредственно следующие за ними directory-separator.
- Если последнее имя файла — dot-dot, удалить все завершающие directory-separator.
- Если путь пуст, добавить dot (нормальная форма
./—.).
Путь можно обходить поэлементно с помощью итераторов, возвращаемых функциями 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 с value_type типа path, удовлетворяющий всем требованиям LegacyBidirectionalIterator, за исключением того, что для двух равных итераторов, допускающих разыменование, a и b типа const_iterator, не требуется, чтобы *a и *b ссылались на один и тот же объект. Не указано, является ли |
||||||||
iterator |
const_iterator |
||||||||
| определяет способ интерпретации строковых представлений имён путей.
(открытое перечисление-член) |
Константы-члены
|
constexpr value_type preferred_separator
[static] | альтернативный разделитель каталогов, который можно использовать наряду с переносимым разделителем /. В Windows это символ обратной косой черты \. В POSIX это та же прямая косая черта /, что и переносимый разделитель (открытая статическая константа-член) |
Функции-члены
создаёт объект path (открытая функция-член) |
|
уничтожает объект path (открытая функция-член) |
|
| присваивает другой путь (открытая функция-член) |
|
| присваивает содержимое (открытая функция-член) |
|
Конкатенация |
|
| добавляет элементы к пути, вставляя разделитель каталогов (открытая функция-член) |
|
| объединяет два пути без вставки разделителя каталогов (открытая функция-член) |
|
Модификаторы |
|
| удаляет содержимое (открытая функция-член) |
|
| заменяет разделители каталогов предпочтительным разделителем каталогов (открытая функция-член) |
|
| удаляет компонент пути, соответствующий имени файла (открытая функция-член) |
|
| заменяет последний компонент пути другим путём (открытая функция-член) |
|
| заменяет расширение (открытая функция-член) |
|
| обменивает два пути (открытая функция-член) |
|
Функции доступа к формату |
|
| возвращает путь в нативном формате (открытая функция-член) |
|
| возвращает путь в нативном формате имени пути, преобразованный в строку (открытая функция-член) |
|
| возвращает путь в общем формате имени пути, преобразованный в строку (открытая функция-член) |
|
Сравнение |
|
| лексикографически сравнивает лексические представления двух путей (открытая функция-член) |
|
Построение |
|
| преобразует путь к нормальной форме преобразует путь к относительной форме преобразует путь к приближённой форме (открытая функция-член) |
|
Разложение |
|
| возвращает корневое имя пути, если оно есть (открытая функция-член) |
|
| возвращает корневой каталог пути, если он есть (открытая функция-член) |
|
| возвращает корневой путь, если он есть (открытая функция-член) |
|
| возвращает путь относительно корневого пути (открытая функция-член) |
|
| возвращает путь родительского пути (открытая функция-член) |
|
| возвращает компонент пути, соответствующий имени файла (открытая функция-член) |
|
| возвращает компонент пути stem (имя файла без последнего расширения) (открытая функция-член) |
|
| возвращает компонент пути, соответствующий расширению файла (открытая функция-член) |
|
Проверки |
|
| проверяет, является ли путь пустым (открытая функция-член) |
|
| проверяет, не является ли соответствующий элемент пути пустым (открытая функция-член) |
|
проверяет, однозначно ли root_path() задаёт расположение в файловой системе (открытая функция-член) |
|
Итераторы |
|
| доступ к пути через итераторы как к последовательности элементов (открытая функция-член) |
|
Функции, не являющиеся членами
Определены в пространстве имён std::filesystem |
|
|---|---|
|
(C++17) | специализирует алгоритм std::swap (функция) |
|
(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) | лексикографически сравнивает два пути (функция) |
|
(C++17) | объединяет два пути с разделителем каталогов (функция) |
|
(C++17) | выполняет ввод и вывод заключённого в кавычки пути через поток (функция) |
|
(C++17)(устарела в C++20) | создаёт path из источника в кодировке UTF-8 (функция) |
Вспомогательные классы
Определены в пространстве имён std |
|
|---|---|
|
(C++17) | поддержка хеширования для std::filesystem::path (специализация шаблона класса) |
|
(C++26) | поддержка форматирования для 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/cpp/filesystem/path