Пространства имён
Варианты
Действия

std::std::filesystem::path

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

Объекты класса path представляют собой путевые имена файловой системы. При этом обрабатывается только синтаксическая корректность путей: путевое имя может описывать несуществующий путь или вовсе быть недопустимым в данной файловой или операционной системе (ОС).

Путевые имена обладают следующим синтаксисом:

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

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

  1. Если путь пуст, завершить (нормальная форма пустого пути — это пустой путь).
  2. Заменить каждый разделитель-каталогов (который может состоять из нескольких символов косой черты) одним предпочтительным разделителем каталогов path::preferred_separator.
  3. Заменить каждый символ косой черты в корневом-имени предпочтительным разделителем каталогов path::preferred_separator.
  4. Удалить каждый символ точки вместе с разделитем-каталогов, который следует непосредственно за ним.
  5. Удалить каждое имя файла, отличное от двух-точек, за которым следуют разделитель-каталогов и две-точки, а также любой следующий непосредственно за ним разделитель-каталогов.
  6. Если присутствует корневой-каталог, удалить все две-точки вместе с любым разделителем-каталогов, следующим непосредственно за ними.
  7. Если последнее имя файла — две-точки, удалить любой завершающий разделитель-каталогов.
  8. Если путь пуст, добавить точку (нормальная форма пути ./ — это путь .).

Путь можно обойти поэлементно с помощью итераторов, возвращаемых функциями begin() и end(), которые представляют путь в обобщенном формате и проходят по корневому имени, корневому каталогу и последующим именам файлов (разделители каталогов пропускаются, исключая тот, что обозначает корневой каталог). Если самым последним элементом пути является разделитель каталогов, результатом разыменования последнего итератора будет пустой элемент.

Вызов любой неконстантной функции-члена класса path делает недействительными все итераторы, ссылающиеся на элементы этого объекта.

Если ОС использует нативный синтаксис, который отличается от описанного выше портируемого обобщенного синтаксиса, библиотечные функции, способные определять формат, принимают путевые имена в обоих форматах: аргумент определенного формата рассматривается как обобщенный путь тогда и только тогда, когда он соответствует обобщенному формату и недопустим в качестве нативного пути для данной операционной системы. На тех ОС, где нативный формат путевых имен различается для каталогов и для файлов, обобщенный путь рассматривается как каталог, если оканчивается на разделитель каталогов, и как обычный файл в других случаях.

В любом случае объекты класса path ведут себя так, будто они хранят путевые имена в нативном формате и автоматически преобразуют их в обобщенный формат при необходимости (каждая функция-член указывает, в каком формате она интерпретирует путь).

На POSIX-совместимых системах обобщенный формат также является нативным форматом, и потому нет необходимости различать или преобразовывать их между собой.

Пути неявно преобразуются в строковый тип std::basic_string и наоборот, что позволяет использовать их с другими файловыми API.

Потоковый оператор вывода использует std::quoted, поэтому пробельные символы не вызывают усечения путевого имени, если оно впоследствии читается с помощью потокового оператора ввода.

Функции-члены декомпозиции (например, extension) возвращают объект класса filesystem::path вместо строковых типов, в отличие от других API.

Содержание

[править]Типы-члены

Тип Определение
value_type строковый тип, используемый в нативной кодировке файловой системы: char в POSIX, wchar_t в Windows
string_typestd::basic_string<value_type>
const_iterator константный LegacyInputIterator с типом path в качестве value_type, удовлетворяющий требованиям LegacyBidirectionalIterator, однако для двух одинаковых итераторов a и b типа const_iterator, к которым применяется операция разыменования, не предъявляется требования, чтобы *a и *b ссылались на один и тот же объект.

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

iterator псевдоним для const_iterator
(C++17)
определяет, как интерпретировать строковое представление путевых имен.

Также определены следующие элементы перечисления:

Константа Описание
native_format нативный формат файловых имен
generic_format обобщенный формат файловых имен
auto_format зависящий от реализации формат, автоматически определяется там, где возможно

(перечисление)

[править]Константы-члены

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 функция-элемент)[править]

[править]Функции, не являющиеся членами

Шаблон:cpp/filesystem/path/dsc operator/Шаблон:cpp/filesystem/path/dsc operator ltltgtgtШаблон:cpp/filesystem/path/dsc u8path
Определены в пространстве имён std::filesystem
меняет местами два пути
(функция)[править]
(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 была отключена включена
close