Spec-Zone.ru › C++

std::filesystem::path

Определён в заголовочном файле <filesystem>
class path;
(начиная с C++17)

Объекты типа path представляют пути в файловой системе. Обрабатываются только синтаксические аспекты путей: имя пути может обозначать несуществующий путь или даже путь, существование которого не допускается в текущей файловой системе или ОС.

Имя пути имеет следующий синтаксис:

  1. root-name(необязательно): задаёт корень в файловой системе с несколькими корнями (например, "C:" или "//myserver"). В случае неоднозначности последовательность символов наибольшей длины, образующая допустимое root-name, считается root-name. Стандартная библиотека может определять дополнительные корневые имена, помимо тех, которые распознаются API операционной системы.
  2. root-directory(необязательно): разделитель каталогов, наличие которого указывает, что путь является абсолютным. Если он отсутствует (и первый элемент после корневого имени является именем файла), путь является относительным и для разрешения в имя файла ему требуется другой путь в качестве начального расположения.
  3. Ноль или более следующих элементов:
  • file-name: последовательность символов, не являющихся разделителями каталогов или предпочтительными разделителями каталогов (ОС или файловая система могут накладывать дополнительные ограничения). Это имя может обозначать файл, жёсткую ссылку, символическую ссылку или каталог. Распознаются два специальных значения file-name:
    • dot: имя файла, состоящее из одного символа точки ., является именем каталога, обозначающим текущий каталог.
    • dot-dot: имя файла, состоящее из двух символов точки .., является именем каталога, обозначающим родительский каталог.
  • directory-separator: символ прямой косой черты / или альтернативный символ, задаваемый как path::preferred_separator. Если этот символ повторяется, он считается одним разделителем каталогов: /usr///////lib эквивалентно /usr/lib.

Путь можно нормализовать по следующему алгоритму:

  1. Если путь пуст, остановиться (нормальная форма пустого пути — пустой путь).
  2. Заменить каждый directory-separator (который может состоять из нескольких косых черт) одним символом path::preferred_separator.
  3. Заменить каждый символ косой черты в root-name на path::preferred_separator.
  4. Удалить каждую dot и любой непосредственно следующий за ней directory-separator.
  5. Удалить каждое имя файла, не являющееся dot-dot, за которым непосредственно следуют directory-separator и dot-dot, а также любой непосредственно следующий за ними directory-separator.
  6. Если имеется root-directory, удалить все dot-dot и любые непосредственно следующие за ними directory-separator.
  7. Если последнее имя файла — dot-dot, удалить все завершающие directory-separator.
  8. Если путь пуст, добавить 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 ссылались на один и тот же объект.

Не указано, является ли const_iterator на самом деле LegacyBidirectionalIterator

iterator const_iterator
format
определяет способ интерпретации строковых представлений имён путей.
Имя Пояснение
native_format нативный формат имени пути
generic_format общий формат имени пути
auto_format формат, определяемый реализацией и автоматически распознаваемый, если это возможно

(открытое перечисление-член)

Константы-члены

constexpr value_type preferred_separator
[static]
альтернативный разделитель каталогов, который можно использовать наряду с переносимым разделителем /. В Windows это символ обратной косой черты \. В POSIX это та же прямая косая черта /, что и переносимый разделитель
(открытая статическая константа-член)

Функции-члены

(конструктор)
создаёт объект path
(открытая функция-член)
(деструктор)
уничтожает объект path
(открытая функция-член)
operator=
присваивает другой путь
(открытая функция-член)
assign
присваивает содержимое
(открытая функция-член)
Конкатенация
appendoperator/=
добавляет элементы к пути, вставляя разделитель каталогов
(открытая функция-член)
concatoperator+=
объединяет два пути без вставки разделителя каталогов
(открытая функция-член)
Модификаторы
clear
удаляет содержимое
(открытая функция-член)
make_preferred
заменяет разделители каталогов предпочтительным разделителем каталогов
(открытая функция-член)
remove_filename
удаляет компонент пути, соответствующий имени файла
(открытая функция-член)
replace_filename
заменяет последний компонент пути другим путём
(открытая функция-член)
replace_extension
заменяет расширение
(открытая функция-член)
swap
обменивает два пути
(открытая функция-член)
Функции доступа к формату
c_strnativeoperator string_type
возвращает путь в нативном формате
(открытая функция-член)
stringwstringu8stringu16stringu32string
возвращает путь в нативном формате имени пути, преобразованный в строку
(открытая функция-член)
generic_stringgeneric_wstringgeneric_u8stringgeneric_u16stringgeneric_u32string
возвращает путь в общем формате имени пути, преобразованный в строку
(открытая функция-член)
Сравнение
compare
лексикографически сравнивает лексические представления двух путей
(открытая функция-член)
Построение
lexically_normallexically_relativelexically_proximate
преобразует путь к нормальной форме
преобразует путь к относительной форме
преобразует путь к приближённой форме
(открытая функция-член)
Разложение
root_name
возвращает корневое имя пути, если оно есть
(открытая функция-член)
root_directory
возвращает корневой каталог пути, если он есть
(открытая функция-член)
root_path
возвращает корневой путь, если он есть
(открытая функция-член)
relative_path
возвращает путь относительно корневого пути
(открытая функция-член)
parent_path
возвращает путь родительского пути
(открытая функция-член)
filename
возвращает компонент пути, соответствующий имени файла
(открытая функция-член)
stem
возвращает компонент пути stem (имя файла без последнего расширения)
(открытая функция-член)
extension
возвращает компонент пути, соответствующий расширению файла
(открытая функция-член)
Проверки
empty
проверяет, является ли путь пустым
(открытая функция-член)
has_root_pathhas_root_namehas_root_directoryhas_relative_pathhas_parent_pathhas_filenamehas_stemhas_extension
проверяет, не является ли соответствующий элемент пути пустым
(открытая функция-член)
is_absoluteis_relative
проверяет, однозначно ли root_path() задаёт расположение в файловой системе
(открытая функция-член)
Итераторы
beginend
доступ к пути через итераторы как к последовательности элементов
(открытая функция-член)

Функции, не являющиеся членами

Определены в пространстве имён std::filesystem
swap(std::filesystem::path)
(C++17)
специализирует алгоритм std::swap
(функция)
hash_value
(C++17)
вычисляет хеш-значение объекта path
(функция)
operator==operator!=operator<operator<=operator>operator>=operator<=>
(C++17)(C++17)(до C++20)(C++17)(до C++20)(C++17)(до C++20)(C++17)(до C++20)(C++17)(до C++20)(C++20)
лексикографически сравнивает два пути
(функция)
operator/
(C++17)
объединяет два пути с разделителем каталогов
(функция)
operator<<operator>>
(C++17)
выполняет ввод и вывод заключённого в кавычки пути через поток
(функция)
u8path
(C++17)(устарела в C++20)
создаёт path из источника в кодировке UTF-8
(функция)

Вспомогательные классы

Определены в пространстве имён std
std::hash<std::filesystem::path>
(C++17)
поддержка хеширования для std::filesystem::path
(специализация шаблона класса)
std::formatter<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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API