Соответствие определяется поведением. Идеальное поведение не всегда реализуемо, поэтому в подразделах о соответствии это учтено.
Некоторое поведение определяется ссылкой на POSIX ([fs.norm.ref]). Как на самом деле реализуется такое поведение, не уточняется. [ Note: Это составляет правило «как если бы», позволяющее реализациям вызывать собственную операционную систему или другие API. ] — end note
Реализациям рекомендуется обеспечивать такое поведение, как оно определено в POSIX. Реализации должны документировать любое поведение, которое отличается от поведения, определенного POSIX. Реализациям, которые не поддерживают точное поведение POSIX, рекомендуется обеспечивать поведение, максимально приближенное к поведению POSIX, насколько это разумно с учетом ограничений реальных операционных систем и файловых систем. Если реализация не может обеспечить какое-либо разумное поведение, реализация должна сообщить об ошибке, как указано в [fs.err.report]. [ Note: Это позволяет пользователям полагаться на возникшее исключение или установленный код ошибки, когда реализация не может обеспечить какое-либо разумное поведение. ] — end note
Реализации не обязаны обеспечивать поведение, которое не поддерживается конкретной файловой системой. [ Example: Файловая система FAT, используемая некоторыми картами памяти, памятью камеры и гибкими дисками, не поддерживает жесткие ссылки, символические ссылки и многие другие функции более функциональных файловых систем, поэтому не требуются реализации для поддержки этих функций в файловой системе FAT, но вместо этого требуется сообщить об ошибке, как описано выше. ] — end example
Некоторое поведение указывается как имеющееся operating system dependent. Операционная система, от которой зависит реализация, определяется реализацией.
Поведение не определено, если вызовы функций, предоставленные этим подпунктом, вводят file system race.
Если возможность гонки файловой системы сделает для программы ненадежной проверку предусловия перед вызовом функции, описанной здесь, Requires: для функции не указано. [ Note: В соответствии с практикой проектирования предварительные условия не указываются, когда программа не имеет смысла обнаруживать их до вызова функции. ] — end note
POSIX® - зарегистрированная торговая марка IEEE. Windows® является зарегистрированным товарным знаком Microsoft Corporation. Эта информация дается для удобства пользователей этого документа и не означает одобрения этих продуктов со стороны ISO или IEC.
Путь, который однозначно определяет местоположение файла без ссылки на дополнительное начальное местоположение. Элементы пути, определяющие, является ли он абсолютным, зависят от операционной системы.
Файл в файловой системе, который действует как контейнер записей каталога, содержащих информацию о других файлах, возможно, включая другие файлы каталога.
Объект в файловой системе, содержащий пользовательские или системные данные. Файлы можно записывать, читать из них или и то, и другое. У файла есть определенные атрибуты, включая тип. Типы файлов включают обычные файлы и каталоги. Другие типы файлов, например symbolic links, могут поддерживаться реализацией.
Коллекция файлов и их атрибутов.
Состояние, которое возникает, когда несколько потоков, процессов или компьютеров чередуют доступ и изменение одного и того же объекта в файловой системе.
Имя файла. Имена файлов dot и dot-dot, состоящие только из одного и двух символов точки соответственно, имеют особое значение. Следующие характеристики имен файлов зависят от операционной системы:
Разрешенные символы. [ Example: Некоторые операционные системы запрещают использование управляющих символов ASCII (0x00 - 0x1F) в именах файлов. ] — end example
Максимально допустимая длина.
Запрещенные имена файлов.
Имена файлов, имеющие особое значение.
Знание регистра и чувствительность при разрешении пути.
Специальные правила, которые могут применяться к типам файлов, отличных от обычных файлов, например к каталогам.
A link в существующий файл. Некоторые файловые системы поддерживают несколько жестких ссылок на файл. Если последняя жесткая ссылка на файл удалена, удаляется и сам файл. [ Note: Жесткую ссылку можно рассматривать как интеллектуальный указатель на файл с совместным владением. ] — end note
Объект, который связывает имя файла с файлом. Несколько ссылок могут связывать имена с одним и тем же файлом.
Для узких символьных строк текущая кодировка путей ([fs.def.pathname]) зависит от операционной системы . Для строк широких символов определяется реализация кодировки расширенного набора символов ([lex.charset]).
Формат пути, зависящий от операционной системы, принимаемый операционной системой хоста.
Путь в нормальной форме называется normalized. Вызывается процесс получения нормализованного пути из пути, который не находится в нормальной форме normalization.
Нормализация имени пути общего формата означает:
Если путь пуст, остановитесь.
Замените каждый символ косой черты в root-nameсимволе preferred-separator.
Замените каждый directory-separatorна preferred-separator. [ Note: Общая грамматика имени пути ([fs.path.generic]) определяет directory-separatorкак одну или несколько косых черт и preferred-separators. ] — end note
Удалите каждое dot имя файла и все сразу после него directory-separator.
Если появятся какие-либо, удалите неdot-dot имя файла, за которым сразу следует имя directory-separatorи dot-dot имя файла, а также все, что непосредственно следует за ним directory-separator.
Если есть root-directory, удалите все dot-dot имена файлов и все, что directory-separators сразу после них. [ Note: Эти dot-dot имена файлов пытаются ссылаться на несуществующие родительские каталоги. ] — end note
Если последним именем файла является dot-dot, удалите все завершающие directory-separator.
Если путь пуст, добавьте dot.
Поведение, зависящее от поведения и характеристик операционной системы. Смотрите [fs.conform.os].
& langle; каталога & rangle; каталог, который содержит запись каталога для данного каталога и представлен именем файла dot-dot в данном каталоге.
& langle; других типов файлов & rangle; каталог, содержащий запись каталога для обсуждаемого файла.
Последовательность элементов, определяющих расположение файла в файловой системе. Эти элементы являются root-nameopt, root-directoryoptи необязательной последовательностью имен файлов. Максимальное количество элементов в последовательности зависит от операционной системы.
Строка символов, представляющая имя пути. Имена путей форматируются в соответствии с generic pathname format грамматикой или собственным форматом имени пути, зависящим от операционной системы.
Разрешение имени пути - это зависимый от операционной системы механизм для разрешения имени пути к определенному файлу в файловой иерархии. Может быть несколько имен пути, которые разрешаются в один и тот же файл. [ Example: POSIX определяет механизм в разделе 4.11, Разрешение пути. ] — end example
Путь, который не является абсолютным и как таковой, только однозначно определяет местоположение файла при разрешении ([fs.def.pathres]) относительно предполагаемого начального местоположения. Элементы пути, определяющие, является ли он относительным, зависят от операционной системы. [ Note: Пути "." и «..» - относительные пути. ] — end note
Тип файла со свойством, заключающимся в том, что при обнаружении файла во время разрешения имени пути сохраненная в файле строка используется для изменения разрешения имени пути. [ Note: Символические ссылки часто называют символическими ссылками. Символьную ссылку можно рассматривать как необработанный указатель на файл. Если указанный файл не существует, символическая ссылка называется «висящей» символической ссылкой. ] — end note
На протяжении всего этого подпункта, char, wchar_t, char16_t, и char32_t собирательно называют encoded character types.
Функции с указанными параметрами шаблона EcharT не должны участвовать в разрешении перегрузки, если EcharT это не один из типов закодированных символов.
Именованные параметры шаблона InputIterator должны соответствовать input iterator requirements и должны иметь тип значения, который является одним из типов кодированных символов.
[ Note: Использование кодированного типа символа подразумевает связанный набор символов и кодировку. Поскольку signed char и не unsigned char имеют подразумеваемого набора символов и кодировки, они не включены как разрешенные типы. ] — end note
namespace std::filesystem { // [fs.class.path], paths class path; // [fs.path.nonmember], path non-member functions void swap(path& lhs, path& rhs) noexcept; size_t hash_value(const path& p) noexcept; bool operator==(const path& lhs, const path& rhs) noexcept; bool operator!=(const path& lhs, const path& rhs) noexcept; bool operator< (const path& lhs, const path& rhs) noexcept; bool operator<=(const path& lhs, const path& rhs) noexcept; bool operator> (const path& lhs, const path& rhs) noexcept; bool operator>=(const path& lhs, const path& rhs) noexcept; path operator/ (const path& lhs, const path& rhs); // [fs.path.io], path inserter and extractor template <class charT, class traits> basic_ostream<charT, traits>& operator<<(basic_ostream<charT, traits>& os, const path& p); template <class charT, class traits> basic_istream<charT, traits>& operator>>(basic_istream<charT, traits>& is, path& p); // [fs.path.factory], path factory functions template <class Source> path u8path(const Source& source); template <class InputIterator> path u8path(InputIterator first, InputIterator last); // [fs.class.filesystem_error], filesystem errors class filesystem_error; // [fs.class.directory_entry], directory entries class directory_entry; // [fs.class.directory_iterator], directory iterators class directory_iterator; // [fs.dir.itr.nonmembers], range access for directory iterators directory_iterator begin(directory_iterator iter) noexcept; directory_iterator end(const directory_iterator&) noexcept; // [fs.class.rec.dir.itr], recursive directory iterators class recursive_directory_iterator; // [fs.rec.dir.itr.nonmembers], range access for recursive directory iterators recursive_directory_iterator begin(recursive_directory_iterator iter) noexcept; recursive_directory_iterator end(const recursive_directory_iterator&) noexcept; // [fs.class.file_status], file status class file_status; struct space_info { uintmax_t capacity; uintmax_t free; uintmax_t available; }; // [fs.enum], enumerations enum class file_type; enum class perms; enum class perm_options; enum class copy_options; enum class directory_options; using file_time_type = chrono::time_point<trivial-clock>; // [fs.op.funcs], filesystem operations path absolute(const path& p, const path& base = current_path()); path canonical(const path& p, const path& base = current_path()); path canonical(const path& p, error_code& ec); path canonical(const path& p, const path& base, error_code& ec); void copy(const path& from, const path& to); void copy(const path& from, const path& to, error_code& ec) noexcept; void copy(const path& from, const path& to, copy_options options); void copy(const path& from, const path& to, copy_options options, error_code& ec) noexcept; bool copy_file(const path& from, const path& to); bool copy_file(const path& from, const path& to, error_code& ec) noexcept; bool copy_file(const path& from, const path& to, copy_options option); bool copy_file(const path& from, const path& to, copy_options option, error_code& ec) noexcept; void copy_symlink(const path& existing_symlink, const path& new_symlink); void copy_symlink(const path& existing_symlink, const path& new_symlink, error_code& ec) noexcept; bool create_directories(const path& p); bool create_directories(const path& p, error_code& ec) noexcept; bool create_directory(const path& p); bool create_directory(const path& p, error_code& ec) noexcept; bool create_directory(const path& p, const path& attributes); bool create_directory(const path& p, const path& attributes, error_code& ec) noexcept; void create_directory_symlink(const path& to, const path& new_symlink); void create_directory_symlink(const path& to, const path& new_symlink, error_code& ec) noexcept; void create_hard_link(const path& to, const path& new_hard_link); void create_hard_link(const path& to, const path& new_hard_link, error_code& ec) noexcept; void create_symlink(const path& to, const path& new_symlink); void create_symlink(const path& to, const path& new_symlink, error_code& ec) noexcept; path current_path(); path current_path(error_code& ec); void current_path(const path& p); void current_path(const path& p, error_code& ec) noexcept; bool exists(file_status s) noexcept; bool exists(const path& p); bool exists(const path& p, error_code& ec) noexcept; bool equivalent(const path& p1, const path& p2); bool equivalent(const path& p1, const path& p2, error_code& ec) noexcept; uintmax_t file_size(const path& p); uintmax_t file_size(const path& p, error_code& ec) noexcept; uintmax_t hard_link_count(const path& p); uintmax_t hard_link_count(const path& p, error_code& ec) noexcept; bool is_block_file(file_status s) noexcept; bool is_block_file(const path& p); bool is_block_file(const path& p, error_code& ec) noexcept; bool is_character_file(file_status s) noexcept; bool is_character_file(const path& p); bool is_character_file(const path& p, error_code& ec) noexcept; bool is_directory(file_status s) noexcept; bool is_directory(const path& p); bool is_directory(const path& p, error_code& ec) noexcept; bool is_empty(const path& p); bool is_empty(const path& p, error_code& ec) noexcept; bool is_fifo(file_status s) noexcept; bool is_fifo(const path& p); bool is_fifo(const path& p, error_code& ec) noexcept; bool is_other(file_status s) noexcept; bool is_other(const path& p); bool is_other(const path& p, error_code& ec) noexcept; bool is_regular_file(file_status s) noexcept; bool is_regular_file(const path& p); bool is_regular_file(const path& p, error_code& ec) noexcept; bool is_socket(file_status s) noexcept; bool is_socket(const path& p); bool is_socket(const path& p, error_code& ec) noexcept; bool is_symlink(file_status s) noexcept; bool is_symlink(const path& p); bool is_symlink(const path& p, error_code& ec) noexcept; file_time_type last_write_time(const path& p); file_time_type last_write_time(const path& p, error_code& ec) noexcept; void last_write_time(const path& p, file_time_type new_time); void last_write_time(const path& p, file_time_type new_time, error_code& ec) noexcept; void permissions(const path& p, perms prms, perm_options opts=perm_options::replace); void permissions(const path& p, perms prms, error_code& ec) noexcept; void permissions(const path& p, perms prms, perm_options opts, error_code& ec); path proximate(const path& p, error_code& ec); path proximate(const path& p, const path& base = current_path()); path proximate(const path& p, const path& base, error_code& ec); path read_symlink(const path& p); path read_symlink(const path& p, error_code& ec); path relative(const path& p, error_code& ec); path relative(const path& p, const path& base = current_path()); path relative(const path& p, const path& base, error_code& ec); bool remove(const path& p); bool remove(const path& p, error_code& ec) noexcept; uintmax_t remove_all(const path& p); uintmax_t remove_all(const path& p, error_code& ec) noexcept; void rename(const path& from, const path& to); void rename(const path& from, const path& to, error_code& ec) noexcept; void resize_file(const path& p, uintmax_t size); void resize_file(const path& p, uintmax_t size, error_code& ec) noexcept; space_info space(const path& p); space_info space(const path& p, error_code& ec) noexcept; file_status status(const path& p); file_status status(const path& p, error_code& ec) noexcept; bool status_known(file_status s) noexcept; file_status symlink_status(const path& p); file_status symlink_status(const path& p, error_code& ec) noexcept; path temp_directory_path(); path temp_directory_path(error_code& ec); path weakly_canonical(const path& p); path weakly_canonical(const path& p, error_code& ec); }
trivial-clock - это определяемый реализацией тип, который удовлетворяет требованиям TrivialClock requirements и может представлять и измерять значения времени файла. Реализации должны гарантировать, что разрешение и диапазон file_time_type отражают разрешение, зависящее от операционной системы, и диапазон значений времени файла.
Функции библиотеки файловой системы часто предоставляют две перегрузки: одна генерирует исключение для сообщения об ошибках файловой системы, а другая устанавливает файл error_code. [ Note: Это поддерживает два распространенных варианта использования:
Используется там, где ошибки файловой системы действительно исключительны и указывают на серьезный сбой. Выброс исключения - это подходящий ответ.
Используется там, где ошибки файловой системы являются обычными и не обязательно означают сбой. Наиболее подходящим ответом является возврат кода ошибки. Это позволяет обрабатывать ошибки приложения, в том числе просто игнорировать ошибку.
— end note ]
Функции, не имеющие аргумента типа, error_code& обрабатывают ошибки следующим образом, если не указано иное:
Когда вызов реализацией операционной системы или другого базового API приводит к ошибке, которая не позволяет функции соответствовать ее спецификациям,filesystem_error должно быть выброшено исключение типа . Для функций с одним аргументом пути этот аргумент должен быть передан filesystem_error конструктору с одним аргументом пути. Для функций с двумя аргументами пути первый из этих аргументов должен быть передан filesystem_error конструктору как path1 аргумент, а второй должен быть передан как path2 аргумент. В filesystem_error конструкторском error_code аргумент устанавливается в зависимости от обстоятельств зависимой ошибки конкретной операционной системы.
О невозможности выделить хранилище сообщается путем выдачи исключения, как описано в [res.on.exception.handling].
Деструкторы ничего не выкидывают.
Функции, имеющие аргумент типа, error_code& обрабатывают ошибки следующим образом, если не указано иное:
Если вызов реализацией операционной системы или другого базового API приводит к ошибке, которая не позволяет функции соответствовать ее спецификациям, error_code& аргумент устанавливается в соответствии с конкретной зависимой от операционной системы ошибкой. В противном случае clear() вызывается error_code& аргумент.
Объект класса path представляет собой path и содержит pathname. Такой объект касается только лексических и синтаксических аспектов пути. Путь не обязательно существует во внешнем хранилище, и путь не обязательно действителен для текущей операционной системы или для конкретной файловой системы.
[ Note: Класс path используется для поддержки различий между типами строк, используемых разными операционными системами для представления имен путей, и для выполнения преобразований между кодировками, когда это необходимо. ] — end note
namespace std::filesystem { class path { public: using value_type = see below; using string_type = basic_string<value_type>; static constexpr value_type preferred_separator = see below; // [fs.enum.path.format], enumeration format enum format; // [fs.path.construct], constructors and destructor path() noexcept; path(const path& p); path(path&& p) noexcept; path(string_type&& source, format fmt = auto_format); template <class Source> path(const Source& source, format fmt = auto_format); template <class InputIterator> path(InputIterator first, InputIterator last, format fmt = auto_format); template <class Source> path(const Source& source, const locale& loc, format fmt = auto_format); template <class InputIterator> path(InputIterator first, InputIterator last, const locale& loc, format fmt = auto_format); ~path(); // [fs.path.assign], assignments path& operator=(const path& p); path& operator=(path&& p) noexcept; path& operator=(string_type&& source); path& assign(string_type&& source); template <class Source> path& operator=(const Source& source); template <class Source> path& assign(const Source& source) template <class InputIterator> path& assign(InputIterator first, InputIterator last); // [fs.path.append], appends path& operator/=(const path& p); template <class Source> path& operator/=(const Source& source); template <class Source> path& append(const Source& source); template <class InputIterator> path& append(InputIterator first, InputIterator last); // [fs.path.concat], concatenation path& operator+=(const path& x); path& operator+=(const string_type& x); path& operator+=(basic_string_view<value_type> x); path& operator+=(const value_type* x); path& operator+=(value_type x); template <class Source> path& operator+=(const Source& x); template <class EcharT> path& operator+=(EcharT x); template <class Source> path& concat(const Source& x); template <class InputIterator> path& concat(InputIterator first, InputIterator last); // [fs.path.modifiers], modifiers void clear() noexcept; path& make_preferred(); path& remove_filename(); path& replace_filename(const path& replacement); path& replace_extension(const path& replacement = path()); void swap(path& rhs) noexcept; // [fs.path.native.obs], native format observers const string_type& native() const noexcept; const value_type* c_str() const noexcept; operator string_type() const; template <class EcharT, class traits = char_traits<EcharT>, class Allocator = allocator<EcharT>> basic_string<EcharT, traits, Allocator> string(const Allocator& a = Allocator()) const; std::string string() const; std::wstring wstring() const; std::string u8string() const; std::u16string u16string() const; std::u32string u32string() const; // [fs.path.generic.obs], generic format observers template <class EcharT, class traits = char_traits<EcharT>, class Allocator = allocator<EcharT>> basic_string<EcharT, traits, Allocator> generic_string(const Allocator& a = Allocator()) const; std::string generic_string() const; std::wstring generic_wstring() const; std::string generic_u8string() const; std::u16string generic_u16string() const; std::u32string generic_u32string() const; // [fs.path.compare], compare int compare(const path& p) const noexcept; int compare(const string_type& s) const; int compare(basic_string_view<value_type> s) const; int compare(const value_type* s) const; // [fs.path.decompose], decomposition path root_name() const; path root_directory() const; path root_path() const; path relative_path() const; path parent_path() const; path filename() const; path stem() const; path extension() const; // [fs.path.query], query bool empty() const noexcept; bool has_root_name() const; bool has_root_directory() const; bool has_root_path() const; bool has_relative_path() const; bool has_parent_path() const; bool has_filename() const; bool has_stem() const; bool has_extension() const; bool is_absolute() const; bool is_relative() const; // [fs.path.gen], generation path lexically_normal() const; path lexically_relative(const path& base) const; path lexically_proximate(const path& base) const; // [fs.path.itr], iterators class iterator; using const_iterator = iterator; iterator begin() const; iterator end() const; }; }
value_type - это typedef тип кодированных символов, зависящий от операционной системы, используемый для представления имен путей.
Значение preferred_separator члена - это зависимый от операционной системы preferred-separatorсимвол ([fs.path.generic]).
[ Example: Для операционных систем на базе POSIX value_type есть char и preferred_separator остается косая черта ('/'). В операционных системах Windows value_type есть wchar_t и preferred_separator остается символ обратной косой черты (L'\\'). ] — end example
pathname: root-nameopt root-directoryopt relative-path
root-name: operating system dependent sequences of characters implementation-defined sequences of characters
root-directory: directory-separator
relative-path: filename filename directory-separator relative-path an empty path
filename: non-empty sequence of characters other than directory-separator characters
directory-separator: preferred-separator directory-separatoropt fallback-separator directory-separatoropt
preferred-separator: operating system dependent directory separator character
fallback-separator: /, if preferred-separator is not /
[ Note:
Операционные системы часто накладывают ограничения на символы, которые могут использоваться в файле filename. Для широкой переносимости пользователи могут захотеть ограничить количество filename
символов набором символов переносимого имени файла POSIX: ]
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
a b c d e f g h i j k l m n o p q r s t u v w x y z
0 1 2 3 4 5 6 7 8 9 . _ -
— end note
За исключением a root-name, несколько следующих друг за другом directory-separatorсимволов считаются одним directory-separatorсимволом.
Имя файла dot ([fs.def.filename]) рассматривается как ссылка на текущий каталог. Имя файла dot-dot ([fs.def.filename]) рассматривается как ссылка на родительский каталог. То , что имя файл dot-dot относится к относительно root-directoryявляется реализацией. Определенные имена файлов могут иметь особое значение для конкретной операционной системы.
A root-nameопределяет начальное местоположение для разрешения имени пути ([fs.def.pathres]). Если нет зависимостей от операционной системы root-names, требуется по крайней мере одна реализация, определяемая root-name. [ Note: Многие операционные системы определяют имя, начинающееся с двух directory-separatorсимволов, как, root-nameкоторое идентифицирует расположение сети или других ресурсов. Некоторые операционные системы определяют одну букву, за которой следует двоеточие, как спецификатор диска - root-name идентифицирующий конкретное устройство, такое как диск. ] — end note
Если a root-nameв остальном неоднозначно, выбирается вариант с самой длинной последовательностью символов. [ Note: В операционной системе, подобной POSIX, невозможно иметь root-nameи relative-path без промежуточных root-directoryэлементов. ] — end note
[ Note: Преобразования формата, описанные в этом разделе, не применяются в операционных системах на базе POSIX, потому что в этих системах:
Общий формат приемлем как собственный путь.
Нет необходимости различать собственный формат и общий формат в аргументах функции.
Пути к обычным файлам и пути к каталогам имеют одинаковый синтаксис.
— end note ]
Некоторые функции определены для приема detected-format аргументов, которые представляют собой последовательности символов. Аргумент обнаруженного формата представляет путь с использованием либо имени пути в, generic format либо имени пути в native format. Такой аргумент считается имеющимся в общем формате тогда и только тогда, когда он соответствует универсальному формату и неприемлем для операционной системы в качестве собственного пути.
[ Note: Некоторые операционные системы могут не иметь однозначного способа различить аргументы собственного формата и универсального формата. Это сделано специально, поскольку упрощает использование операционных систем, не требующих устранения неоднозначности. Реализации для операционной системы, где требуется разрешение неоднозначности, разрешено различать форматы. ] — end note
При необходимости имена путей преобразуются между общим и собственным форматами в зависимости от операционной системы. Пусть G(n) и N(g) в математическом смысле будут функциями реализации, которые преобразуют родной формат в общий и общий в собственный формат соответственно. Если g=G(n) для некоторых n, то G(N(g))=g; если n=N(g) для некоторых g, то N(G(n))=n. [ Note: Ни и G не N должны быть обратимыми. ] — end note
Если собственный формат требует, чтобы пути к обычным файлам были отформатированы иначе, чем пути к каталогам, путь должен рассматриваться как путь к каталогу, если его последний элемент - a directory-separator, в противном случае он должен рассматриваться как путь к обычному файлу.
[ Note: Путь хранит имя пути в собственном формате ([fs.path.native.obs]) и действует так, как если бы он также хранит имя пути общего формата, как указано ниже. Реализация может сгенерировать имя пути общего формата на основе имени пути в собственном формате (и, возможно, другой информации) по запросу. ] — end note
Когда путь строится из или ему назначается одно представление, отдельное от любого пути, другое представление выбирается соответствующей функцией преобразования (G или N).
Когда (новое) значение p одного представления пути получается из представления того или иного пути, значение q выбирается для другого представления. Значение q преобразуется в p (по G или N в зависимости от обстоятельств), если это делает какое-либо такое значение; q иначе не указано. [ Note: Если q это результат преобразования любого пути, то это результат преобразования p. ] — end note
Для аргументов функций-членов, которые принимают последовательности символов, представляющих пути, и для функций-членов, возвращающих строки, преобразование типа значения и кодировки выполняется, если тип значения аргумента или возвращаемого значения отличается от path::value_type. Для аргумента или возвращаемого значения метод преобразования и кодировка, в которую нужно преобразовать, определяются его типом значения:
char: Кодировка является собственной узкой кодировкой ([fs.def.native.encode]). Метод преобразования, если таковой имеется, зависит от операционной системы. [ Note: Для POSIX операционных систем на основе path::value_type является char поэтому не преобразование из char аргументов типа значения или char значений типа возвращаемого значения не выполняется. Для операционных систем на базе Windows собственная узкая кодировка определяется путем вызова функции Windows API. ] [ Это приводит к поведению, аналогичному поведению других стандартных библиотечных функций C и C ++, которые выполняют файловые операции с использованием узких строк символов для определения путей. Изменение такого поведения может вызвать удивление и привести к ошибкам. ] — end note Note: — end note
wchar_t: Кодировка native wide encoding. Метод преобразования не указан. [ Note: Для операционных систем на базе Windows не path::value_type выполняется wchar_t преобразование из wchar_t аргументов типа значения или в wchar_t возвращаемые значения типа значения. ] — end note
char16_t: Кодировка - UTF-16. Метод преобразования не указан.
char32_t: Кодировка - UTF-32. Метод преобразования не указан.
В дополнение к требованиям ([fs.req]), указанные параметры шаблона функции Source должны быть одним из следующих:
basic_string<EcharT, traits, Allocator>. Аргумент функции const Source& source должен иметь эффективный диапазон [source.begin(), source.end()).
basic_string_view<EcharT, traits>. Аргумент функции const Source& source должен иметь эффективный диапазон [source.begin(), source.end()).
Тип, отвечающий требованиям итератора ввода, который выполняет итерацию по NTCTS. Тип значения должен быть типом закодированного символа. Аргумент функции const Source& source должен иметь эффективный диапазон, [source, end) где end - первое значение итератора со значением элемента, равным iterator_traits<Source>::value_type().
Символьный массив, который после преобразования массива в указатель приводит к указателю на начало NTCTS. Тип значения должен быть типом закодированного символа. Аргумент функции const Source& source должен иметь эффективный диапазон, [source, end) где end - первое значение итератора со значением элемента, равным iterator_traits<decay_t<Source>>::value_type().
Функции, принимающие указанные параметры шаблона Source , не должны участвовать в разрешении перегрузки, если либо
Source является специализацией basic_string или basic_string_view, или
qualified-id iterator_traits<decay_t<Source>>::value_type является действительным , и обозначает , возможно , const закодированный тип символов ([temp.deduct]).
[ Note: Посмотрите, path conversions как указанные выше типы значений и их кодировки преобразуются в path::value_type и его кодировку. ] — end note
path() noexcept;
path(const path& p);
path(path&& p) noexcept;
Effects: Создает объект класса, path имеющий тот же путь в собственном и универсальном форматах, соответственно, что и исходное значение p. Во второй форме p остается в допустимом, но неуказанном состоянии.
path(string_type&& source, format fmt = auto_format);
Effects: Создает объект класса, path для которого имя пути в обнаруженном формате source имеет исходное значение source ([fs.path.fmt.cvt]), преобразовывая формат, если требуется ([fs.path.fmt.cvt]). source остается в допустимом, но неуказанном состоянии.
template <class Source>
path(const Source& source, format fmt = auto_format);
template <class InputIterator>
path(InputIterator first, InputIterator last, format fmt = auto_format);
Effects: Позвольте s быть эффективным диапазоном source ([fs.path.req]) или диапазоном [first, last)с преобразованной кодировкой, если требуется ([fs.path.cvt]). Находит обнаруженный формат s ([fs.path.fmt.cvt]) и создает объект класса, path для которого задан путь в этом формате s.
template <class Source>
path(const Source& source, const locale& loc, format fmt = auto_format);
template <class InputIterator>
path(InputIterator first, InputIterator last, const locale& loc, format fmt = auto_format);
Effects: Позвольте s быть эффективным диапазоном source или диапазоном [first, last)после преобразования кодировки следующим образом:
Если value_type есть wchar_t, преобразуется в стандартную широкую кодировку ([fs.def.native.encode]) с использованием codecvt<wchar_t, char, mbstate_t> аспекта loc.
В противном случае выполняется преобразование с использованием codecvt<wchar_t, char, mbstate_t> фасета loc, а затем выполняется второе преобразование в текущую узкую кодировку.
Находит обнаруженный формат s ([fs.path.fmt.cvt]) и создает объект класса, path для которого задан путь в этом формате s.
[ Example: Строка должна быть прочитана из базы данных, которая закодирована в ISO / IEC 8859-1, и использована для создания каталога:
namespace fs = std::filesystem; std::string latin1_string = read_latin1_data(); codecvt_8859_1<wchar_t> latin1_facet; std::locale latin1_locale(std::locale(), latin1_facet); fs::create_directory(fs::path(latin1_string, latin1_locale));
Для операционных систем на основе POSIX путь создается путем использования сначала latin1_facet для преобразования кодировки ISO / IEC 8859-1 latin1_string в широкую символьную строку в собственной широкой кодировке ([fs.def.native.encode]). Полученная в результате широкая строка затем преобразуется в строку узкого символьного имени пути в текущей собственной узкой кодировке. Если собственная широкая кодировка - UTF-16 или UTF-32, а текущая собственная узкая кодировка - UTF-8, все символы в наборе символов ISO / IEC 8859-1 будут преобразованы в их представление Unicode, но для других в родных узких кодировках некоторые символы могут не иметь представления.
Для операционных систем на базе Windows путь создается с использованием latin1_facet преобразования ISO / IEC 8859-1 latin1_string в строку имени пути с расширенными символами в кодировке UTF-16. Все символы в наборе символов ISO / IEC 8859-1 будут преобразованы в их представление Unicode. ] — end example
path& operator=(const path& p);
Effects: Если *this и p являются одним и тем же объектом, не действует. В противном случае устанавливает оба соответствующих пути *this в соответствующие пути к p.
path& operator=(path&& p) noexcept;
Effects: Если *this и p являются одним и тем же объектом, не действует. В противном случае устанавливает оба соответствующих пути *this в соответствующие пути к p. p остается в допустимом, но неуказанном состоянии. [ Note: Допустимая реализация swap(p). ] — end note
path& operator=(string_type&& source);
path& assign(string_type&& source);
Effects: Устанавливает имя пути в обнаруженном формате source в исходное значение source. source остается в допустимом, но неуказанном состоянии.
template <class Source>
path& operator=(const Source& source);
template <class Source>
path& assign(const Source& source);
template <class InputIterator>
path& assign(InputIterator first, InputIterator last);
Effects: Позвольте s быть эффективным диапазоном source ([fs.path.req]) или диапазоном [first, last)с преобразованной кодировкой, если требуется ([fs.path.cvt]). Находит обнаруженный формат s ([fs.path.fmt.cvt]) и устанавливает путь в этом формате равным s.
Операции добавления используются operator/= для обозначения их семантического эффекта добавления preferred-separatorпри необходимости.
path& operator/=(const path& p);
Effects: Если p.is_absolute() || (p.has_root_name() && p.root_name() != root_name()), то operator=(p).
В противном случае изменяется, *this как если бы эти шаги:
Если p.has_root_directory(), то удаляет любой корневой каталог и относительный путь из имени пути общего формата. В противном случае, если !has_root_directory() && is_absolute() есть true или если has_filename() есть true, то добавляется path::preferred_separator к имени пути общего формата.
Затем добавляет путь в собственном формате p, исключая любые root-nameиз его имени пути общего формата, к имени пути в собственном формате.
[ Example: Даже если //host интерпретируются как root-name, оба пути path("//host")/"foo" и path("//host/")/"foo" равны "//host/foo".
Примеры выражений:
// On POSIX, path("foo") / ""; // yields "foo/" path("foo") / "/bar"; // yields "/bar" // On Windows, backslashes replace slashes in the above yields // On Windows, path("foo") / "c:/bar"; // yields "c:/bar" path("foo") / "c:"; // yields "c:" path("c:") / ""; // yields "c:" path("c:foo") / "/bar"; // yields "c:/bar" path("c:foo") / "c:bar"; // yields "c:foo/bar"
— end example ]
template <class Source>
path& operator/=(const Source& source);
template <class Source>
path& append(const Source& source);
template <class InputIterator>
path& append(InputIterator first, InputIterator last);
path& operator+=(const path& x);
path& operator+=(const string_type& x);
path& operator+=(basic_string_view<value_type> x);
path& operator+=(const value_type* x);
path& operator+=(value_type x);
template <class Source>
path& operator+=(const Source& x);
template <class EcharT>
path& operator+=(EcharT x);
template <class Source>
path& concat(const Source& x);
Effects: Добавляется path(x).native() к имени пути в собственном формате. [ Note: Это напрямую влияет на значение native() и может не переноситься между операционными системами. ] — end note
template <class InputIterator>
path& concat(InputIterator first, InputIterator last);
void clear() noexcept;
path& make_preferred();
Effects: Каждый directory-separator путь в общем формате преобразуется в preferred-separator.
[ Example:
path p("foo/bar"); std::cout << p << '\n'; p.make_preferred(); std::cout << p << '\n';
В операционной системе, где preferred-separatorстоит косая черта, вывод будет следующим:
"foo/bar" "foo/bar"
В операционной системе, где preferred-separatorиспользуется обратная косая черта, вывод будет следующим:
"foo/bar" "foo\bar"
— end example ]
path& remove_filename();
[ Example:
path("foo/bar").remove_filename(); // yields "foo/" path("foo/").remove_filename(); // yields "foo/" path("/foo").remove_filename(); // yields "/" path("/").remove_filename(); // yields "/"
— end example ]
path& replace_filename(const path& replacement);
[ Example:
path("/foo").replace_filename("bar"); // yields "/bar" on POSIX path("/").replace_filename("bar"); // yields "/bar" on POSIX
— end example ]
path& replace_extension(const path& replacement = path());
Effects:
Все существующие extension()([fs.path.decompose]) удаляются из пути в общем формате, затем
Если replacement не пусто и не начинается с точки, точка добавляется к имени пути в общем формате, затем
operator+=(replacement);.
void swap(path& rhs) noexcept;
Строка, возвращаемая всеми наблюдателями в собственном формате, находится в формате native pathname format.
const string_type& native() const noexcept;
const value_type* c_str() const noexcept;
operator string_type() const;
[ Note: Преобразование в string_type предусмотрено для того, чтобы объект класса path можно было передать в качестве аргумента существующим конструкторам файловых потоков стандартной библиотеки и открытым функциям. ] — end note
template <class EcharT, class traits = char_traits<EcharT>,
class Allocator = allocator<EcharT>>
basic_string<EcharT, traits, Allocator>
string(const Allocator& a = Allocator()) const;
Remarks: Все выделение памяти, в том числе для возвращаемого значения, должно выполняться a. Преобразование, если оно есть, определяется [fs.path.cvt].
std::string string() const;
std::wstring wstring() const;
std::string u8string() const;
std::u16string u16string() const;
std::u32string u32string() const;
Remarks: Преобразование, если оно есть, выполняется в соответствии с указаниями [fs.path.cvt]. Кодировка строки, возвращаемой u8string() функцией, всегда UTF-8.
Функции наблюдателя общего формата возвращают строки, отформатированные в соответствии с форматом generic pathname format. Одиночный'/'символ косой черты ( ) используется как directory-separator.
[ Example: В операционной системе, в которой используется обратная косая черта preferred-separator,
path("foo\\bar").generic_string()
возвращается "foo/bar". ] — end example
template <class EcharT, class traits = char_traits<EcharT>,
class Allocator = allocator<EcharT>>
basic_string<EcharT, traits, Allocator>
generic_string(const Allocator& a = Allocator()) const;
Remarks: Все выделение памяти, в том числе для возвращаемого значения, должно выполняться a. Преобразование, если оно есть, определяется [fs.path.cvt].
std::string generic_string() const;
std::wstring generic_wstring() const;
std::string generic_u8string() const;
std::u16string generic_u16string() const;
std::u32string generic_u32string() const;
Remarks: Преобразование, если оно есть, определяется [fs.path.cvt]. Кодировка строки, возвращаемой generic_u8string() функцией, всегда UTF-8.
int compare(const path& p) const noexcept;
Remarks: Элементы определяются как бы итерацией в полуоткрытом диапазоне [begin(), end()) для *this и p.
int compare(const string_type& s) const
int compare(basic_string_view<value_type> s) const;
int compare(const value_type* s) const
path root_name() const;
path root_directory() const;
Returns: root-directory, если путь в универсальном формате включает root-directory, в противном случае path().
path root_path() const;
path relative_path() const;
path parent_path() const;
Returns: *this если !has_relative_path(), в противном случае путь, имя пути общего формата которого является самым длинным префиксом имени пути общего формата, *this который производит на один элемент меньше в своей итерации.
path filename() const;
[ Example:
path("/foo/bar.txt").filename(); // yields "bar.txt" path("/foo/bar").filename(); // yields "bar" path("/foo/bar/").filename(); // yields "" path("/").filename(); // yields "" path("//host").filename(); // yields "" path(".").filename(); // yields "." path("..").filename(); // yields ".."
— end example ]
path stem() const;
[ Example:
std::cout << path("/foo/bar.txt").stem(); // outputs "bar" path p = "foo.bar.baz.tar"; for (; !p.extension().empty(); p = p.stem()) std::cout << p.extension() << '\n'; // outputs: .tar // .baz // .bar
— end example ]
path extension() const;
Returns: путь, имя пути которого в общем формате является суффиксом, filename() не включенным в stem().
[ Example:
path("/foo/bar.txt").extension(); // yields ".txt" and stem() is "bar" path("/foo/bar").extension(); // yields "" and stem() is "bar" path("/foo/.profile").extension(); // yields "" and stem() is ".profile" path(".bar").extension(); // yields "" and stem() is ".bar" path("..bar").extension(); // yields ".bar" and stem() is "."
— end example ]
[ Note: Точка включена в возвращаемое значение, чтобы можно было отличить отсутствие расширения от пустого расширения. ] — end note
bool empty() const noexcept;
bool has_root_path() const;
bool has_root_name() const;
bool has_root_directory() const;
bool has_relative_path() const;
bool has_parent_path() const;
bool has_filename() const;
bool has_stem() const;
bool has_extension() const;
bool is_absolute() const;
Returns: true если путь в собственном формате содержит absolute path, иначе false.
[ Example: path("/").is_absolute() предназначен true для операционных систем false на базе POSIX и для операционных систем на базе Windows. ] — end example
bool is_relative() const;
path lexically_normal() const;
Returns: Путь, имя которого в универсальном формате normal form совпадает с именем пути в универсальном формате *this.
[ Example:
assert(path("foo/./bar/..").lexically_normal() == "foo/"); assert(path("foo/.///bar/../").lexically_normal() == "foo/");
Вышеупомянутые утверждения будут успешными. В Windows directory-separatorсимволы возвращаемого пути будут обратной косой чертой, а не косой чертой, но это не влияет на path равенство. ] — end example
path lexically_relative(const path& base) const;
Effects: Если root_name() != base.root_name() есть true или is_absolute() != base.is_absolute() есть true или !has_root_directory() && base.has_root_directory() есть true, возвращается path(). Определяет первый несовпадающий элемент *this и base как будто по:
auto [a, b] = mismatch(begin(), end(), base.begin(), base.end());
Потом,
если a == end() и b == base.end(), возвращается path("."); иначе
пусть n будет количество filenameэлементов [b, base.end()) , которых нет, dot или dot-dot минус количество, которые есть dot-dot. Если n<0, возвращается path(); иначе
возвращает объект класса path , созданный по умолчанию, за которым следует
приложение operator/=(path("..")) n времен, а затем
применение operator/= для каждого элемента в [a, end()).
[ Example:
assert(path("/a/d").lexically_relative("/a/b/c") == "../../d"); assert(path("/a/b/c").lexically_relative("/a/d") == "../b/c"); assert(path("a/b/c").lexically_relative("a") == "b/c"); assert(path("a/b/c").lexically_relative("a/b/c/x/y") == "../.."); assert(path("a/b/c").lexically_relative("a/b/c") == "."); assert(path("a/b").lexically_relative("c/d") == "../../a/b");
Вышеупомянутые утверждения будут успешными. В Windows directory-separatorсимволы возвращаемого пути будут обратной косой чертой, а не косой чертой, но это не влияет на path равенство. ] — end example
[ Note: Если требуется символическая ссылка, следующая за семантикой, используйте операционную функцию relative(). ] — end note
[ Note: Если normalization необходимо , чтобы обеспечить последовательное согласование элементов, применяются lexically_normal() к *this, baseили обоих. ] — end note
path lexically_proximate(const path& base) const;
Returns: Если значение lexically_relative(base) не является пустым путем, верните его. В противном случае вернитесь *this.
[ Note: Если требуется символическая ссылка, следующая за семантикой, используйте операционную функцию proximate(). ] — end note
[ Note: Если normalization необходимо , чтобы обеспечить последовательное согласование элементов, применяются lexically_normal() к *this, baseили обоих. ] — end note
A path::iterator - это постоянный итератор, удовлетворяющий всем требованиям a, bidirectional iterator за исключением того, что для разыменяемых итераторов a и b типа path::iterator with a == bнет требований, чтобы *a и *b были привязаны к одному и тому же объекту. Его value_type это path.
Вызов любой неконстантной функции-члена path объекта делает недействительными все итераторы, ссылающиеся на элементы этого объекта.
Для элементов имени пути в универсальном формате порядок прямого обхода следующий:
root-nameЭлемент, если он присутствует.
root-directoryЭлемент, если он присутствует. [ Note: Общий формат необходим для правильной работы лексикографического сравнения. ] — end note
Каждый последующий filenameэлемент, если присутствует.
Пустой элемент, если присутствует конечный некорневой элемент directory-separator .
iterator begin() const;
Returns: Итератор для первого присутствующего элемента в списке обхода выше. Если элементы отсутствуют, конечный итератор.
iterator end() const;
void swap(path& lhs, path& rhs) noexcept;
size_t hash_value (const path& p) noexcept;
Returns: Хэш-значение для пути p. Если по двум путям, p1 == p2 то hash_value(p1) == hash_value(p2).
bool operator< (const path& lhs, const path& rhs) noexcept;
bool operator<=(const path& lhs, const path& rhs) noexcept;
bool operator> (const path& lhs, const path& rhs) noexcept;
bool operator>=(const path& lhs, const path& rhs) noexcept;
bool operator==(const path& lhs, const path& rhs) noexcept;
[ Note: Равенство путей и эквивалентность путей имеют разную семантику.
Равенство определяется тем, кто path не является членом operator==, который рассматривает только лексические представления двух путей. [ Example: path("foo") == "bar" никогда не бывает true. ] — end example
Эквивалентность определяется equivalent() функцией, не являющейся членом, которая определяет, есть ли два пути resolve к одному и тому же объекту файловой системы. [ Example: equivalent("foo", "bar") будет, true когда оба пути разрешатся в один и тот же файл. ] — end example
Программисты, желающие определить, являются ли два пути «одинаковыми», должны решить, означает ли «одинаковый» «одно и то же представление» или «разрешить один и тот же фактический файл», и выбрать соответствующую функцию соответственно. ] — end note
bool operator!=(const path& lhs, const path& rhs) noexcept;
path operator/ (const path& lhs, const path& rhs);
template <class charT, class traits>
basic_ostream<charT, traits>&
operator<<(basic_ostream<charT, traits>& os, const path& p);
Effects: Эквивалент: os << quoted(p.string<charT, traits>()); [ функция описана в . ] Note: quoted [quoted.manip] — end note
template <class charT, class traits>
basic_istream<charT, traits>&
operator>>(basic_istream<charT, traits>& is, path& p);
template <class Source>
path u8path(const Source& source);
template <class InputIterator>
path u8path(InputIterator first, InputIterator last);
Requires: Последовательности source и [first, last) кодируются в кодировке UTF-8. Тип значения Source и InputIterator есть char.
Returns:
Если value_type есть, char а текущий native narrow encoding - UTF-8, вернуть path(source) или path(first, last); иначе,
если value_type есть, wchar_t а собственная широкая кодировка - UTF-16, или если value_type есть, char16_t или char32_t, преобразовать source или [first, last) во временное, tmpтипа string_type и возврата path(tmp); иначе,
преобразовать source или [first, last) во временное, tmpтипа u32string и возврата path(tmp).
Remarks: Argument format conversion применяется к аргументам этих функций. Как выполняется преобразование кодировки Unicode, не указано.
[ Example: Строка должна быть прочитана из базы данных, закодированной в UTF-8, и использована для создания каталога с использованием собственной кодировки для имен файлов:
namespace fs = std::filesystem; std::string utf8_string = read_utf8_data(); fs::create_directory(fs::u8path(utf8_string));
Для операционных систем на основе POSIX с собственной узкой кодировкой, установленной на UTF-8, кодирование или преобразование типов не происходит.
Для операционных систем на основе POSIX, в которых для собственной узкой кодировки не задано значение UTF-8, происходит преобразование в UTF-32, за которым следует преобразование в текущую собственную узкую кодировку. Некоторые символы Unicode могут не иметь собственного представления набора символов.
Для операционных систем на базе Windows происходит преобразование из UTF-8 в UTF-16. ] — end example
namespace std::filesystem { class filesystem_error : public system_error { public: filesystem_error(const string& what_arg, error_code ec); filesystem_error(const string& what_arg, const path& p1, error_code ec); filesystem_error(const string& what_arg, const path& p1, const path& p2, error_code ec); const path& path1() const noexcept; const path& path2() const noexcept; const char* what() const noexcept override; }; }
Класс filesystem_error определяет тип объектов, создаваемых как исключения для сообщения об ошибках файловой системы из функций, описанных в этом подпункте.
filesystem_error(const string& what_arg, error_code ec);
filesystem_error(const string& what_arg, const path& p1, error_code ec);
filesystem_error(const string& what_arg, const path& p1, const path& p2, error_code ec);
Postconditions: Постусловия этой функции указаны в таблице 121.
Выражение | Ценить |
runtime_error::what() | what_arg.c_str() |
code() | ec |
path1() | Ссылка на сохраненную копию p1 |
path2() | Ссылка на сохраненную копию p2 |
const path& path1() const noexcept;
const path& path2() const noexcept;
const char* what() const noexcept override;
Это перечисление определяет константы, используемые для идентификации формата символьной последовательности, со значениями, перечисленными в таблице 122.
Этот класс перечисления определяет константы, используемые для идентификации типов файлов, со значениями, перечисленными в Табл 123.
enum class Тип copy_options представляет собой тип битовой маски ([bitmask.types]) , который определяет битовую маску константа используется для управления семантикой операций копирования. Константы указываются в группах опций со значениями, указанными в таблице 124. Константа none отображается в каждой группе опций с целью демонстрации; реализации должны предоставлять только одно определение.
Группа опций, управляющая copy_file эффектами функций для существующих целевых файлов | |
Постоянный | Имея в виду |
none | (По умолчанию) Ошибка; Файл уже существует. |
skip_existing | Не перезаписывать существующий файл, не сообщать об ошибке. |
overwrite_existing | Перезаписать существующий файл. |
update_existing | Замените существующий файл, если он старше заменяемого. |
Группа опций, управляющая copy эффектами функций для подкаталогов | |
Постоянный | Имея в виду |
none | (По умолчанию) Не копировать подкаталоги. |
recursive | Рекурсивно копируйте подкаталоги и их содержимое. |
Группа опций, управляющая copy эффектами функций для символьных ссылок | |
Постоянный | Имея в виду |
none | (По умолчанию) Переход по символическим ссылкам. |
copy_symlinks | Копируйте символические ссылки как символические ссылки, а не копируйте файлы, на которые они указывают. |
skip_symlinks | Игнорируйте символические ссылки. |
Группа опций, управляющая copy эффектами функций для выбора формы копирования | |
Постоянный | Имея в виду |
none | (По умолчанию) Копировать содержимое. |
directories_only | Копировать только структуру каталогов, не копировать файлы, не являющиеся каталогами. |
create_symlinks | Делайте символические ссылки вместо копий файлов. Исходный путь должен быть абсолютным, если путь назначения не находится в текущем каталоге. |
create_hard_links | Делайте жесткие ссылки вместо копий файлов. |
enum class Типа perms является , bitmask type что указывает Bitmask константы используются для идентификации прав доступа к файлам, со значениями , перечисленными в табл 125.
Имя | Ценить | POSIX | Определение или примечания |
(восьмеричный) | макрос | ||
none | 0 | Для файла не установлены разрешения. | |
owner_read | 0400 | S_IRUSR | Разрешение на чтение, владелец |
owner_write | 0200 | S_IWUSR | Разрешение на запись, владелец |
owner_exec | 0100 | S_IXUSR | Разрешение на выполнение / поиск, владелец |
owner_all | 0700 | S_IRWXU |
Читать, писать, выполнять / искать по владельцу; owner_read | owner_write | owner_exec |
group_read | 040 | S_IRGRP | Разрешение на чтение, группа |
group_write | 020 | S_IWGRP | Разрешение на запись, группа |
group_exec | 010 | S_IXGRP | Разрешение на выполнение / поиск, группа |
group_all | 070 | S_IRWXG |
Чтение, запись, выполнение / поиск по группе; group_read | group_write | group_exec |
others_read | 04 | S_IROTH | Разрешение на чтение, другие |
others_write | 02 | S_IWOTH | Разрешение на запись, другие |
others_exec | 01 | S_IXOTH | Разрешение на выполнение / поиск, другие |
others_all | 07 | S_IRWXO |
Читать, писать, выполнять / искать другие; others_read | others_write | others_exec |
all | 0777 | owner_all | group_all | others_all | |
set_uid | 04000 | S_ISUID | Установить идентификатор пользователя при выполнении |
set_gid | 02000 | S_ISGID | Установить идентификатор группы при выполнении |
sticky_bit | 01000 | S_ISVTX | Зависит от операционной системы. |
mask | 07777 | all | set_uid | set_gid | sticky_bit | |
unknown | 0xFFFF | Разрешения неизвестны, например, когда file_status объект создается без указания разрешений. |
enum class Тип perm_options представляет собой тип битовой маски ([bitmask.types]) , который определяет битовую маску константа используется для управления семантикой операций разрешений, со значениями , перечисленных в табле 126. Константы битовой маски являются элементами битовой маски. В таблице 126 perm обозначает значение perms переданного типа permissions.
Имя | Имея в виду |
replace | permissions должен заменить биты разрешений файла на perm |
add | permissions должен заменить биты разрешения файла побитовым ИЛИ perm и текущими битами разрешения файла. |
remove | permissions должен заменить биты разрешений файла побитовым И дополнением perm и текущими битами разрешений файла. |
nofollow | permissions должен изменять разрешения самой символической ссылки, а не разрешения файла, к которому эта ссылка разрешает. |
enum class Тип directory_options представляет собой тип битовая ([bitmask.types]), задающий Bitmask константы используются для определения вариантов обхода каталога, со значениями , перечисленными в табл 127.
Имя | Имея в виду |
none | (По умолчанию) Пропускать символические ссылки на каталог, отказано в разрешении - это ошибка. |
follow_directory_symlink | Следуйте, а не пропускайте символические ссылки на каталоги. |
skip_permission_denied | Пропускать каталоги, для которых в противном случае было бы отказано в разрешении. |
namespace std::filesystem { class file_status { public: // [fs.file_status.cons], constructors and destructor file_status() noexcept : file_status(file_type::none) {} explicit file_status(file_type ft, perms prms = perms::unknown) noexcept; file_status(const file_status&) noexcept = default; file_status(file_status&&) noexcept = default; ~file_status(); // assignments: file_status& operator=(const file_status&) noexcept = default; file_status& operator=(file_status&&) noexcept = default; // [fs.file_status.mods], modifiers void type(file_type ft) noexcept; void permissions(perms prms) noexcept; // [fs.file_status.obs], observers file_type type() const noexcept; perms permissions() const noexcept; }; }
explicit file_status(file_type ft, perms prms = perms::unknown) noexcept;
file_type type() const noexcept;
Returns: Значение, type() заданное постусловиями последнего вызова конструктора operator=, или type(file_type) функции.
perms permissions() const noexcept;
void type(file_type ft) noexcept;
void permissions(perms prms) noexcept;
namespace std::filesystem { class directory_entry { public: // [fs.dir.entry.cons], constructors and destructor directory_entry() noexcept = default; directory_entry(const directory_entry&) = default; directory_entry(directory_entry&&) noexcept = default; explicit directory_entry(const path& p); directory_entry(const path& p, error_code& ec); ~directory_entry(); // assignments: directory_entry& operator=(const directory_entry&) = default; directory_entry& operator=(directory_entry&&) noexcept = default; // [fs.dir.entry.mods], modifiers void assign(const path& p); void assign(const path& p, error_code& ec); void replace_filename(const path& p); void replace_filename(const path& p, error_code& ec); void refresh(); void refresh(error_code& ec) noexcept; // [fs.dir.entry.obs], observers const path& path() const noexcept; operator const path&() const noexcept; bool exists() const; bool exists(error_code& ec) const noexcept; bool is_block_file() const; bool is_block_file(error_code& ec) const noexcept; bool is_character_file() const; bool is_character_file(error_code& ec) const noexcept; bool is_directory() const; bool is_directory(error_code& ec) const noexcept; bool is_fifo() const; bool is_fifo(error_code& ec) const noexcept; bool is_other() const; bool is_other(error_code& ec) const noexcept; bool is_regular_file() const; bool is_regular_file(error_code& ec) const noexcept; bool is_socket() const; bool is_socket(error_code& ec) const noexcept; bool is_symlink() const; bool is_symlink(error_code& ec) const noexcept; uintmax_t file_size() const; uintmax_t file_size(error_code& ec) const noexcept; uintmax_t hard_link_count() const; uintmax_t hard_link_count(error_code& ec) const noexcept; file_time_type last_write_time() const; file_time_type last_write_time(error_code& ec) const noexcept; file_status status() const; file_status status(error_code& ec) const noexcept; file_status symlink_status() const; file_status symlink_status(error_code& ec) const noexcept; bool operator< (const directory_entry& rhs) const noexcept; bool operator==(const directory_entry& rhs) const noexcept; bool operator!=(const directory_entry& rhs) const noexcept; bool operator<=(const directory_entry& rhs) const noexcept; bool operator> (const directory_entry& rhs) const noexcept; bool operator>=(const directory_entry& rhs) const noexcept; private: path pathobject; // exposition only friend class directory_iterator; // exposition only }; }
А directory_entry объект хранит path объект и могут хранить дополнительные объекты для атрибутов файлов , такими как жесткие ссылки, статус, SYMLINK статуса, размер файла и время последней записи.
Реализациям рекомендуется сохранять такие дополнительные атрибуты файлов во время итерации каталога, если их значения доступны, и сохранение значений позволило бы реализации исключить доступ к файловой системе со стороны directory_entry функций наблюдателя ([fs.op.funcs]). Такие сохраненные значения атрибутов файла называются cached.
[ Note: Для демонстрации class directory_iterator ([fs.class.directory_iterator]) показан выше как друг класса directory_entry. Friendship позволяет directory_iterator реализации кэшировать уже доступные значения атрибутов непосредственно в directory_entry объект без затрат на ненужный вызов refresh(). ] — end note
[ Example:
using namespace std::filesystem; // use possibly cached last write time to minimize disk accesses for (auto&& x : directory_iterator(".")) { std::cout << x.path() << " " << x.last_write_time() << std::endl; } // call refresh() to refresh a stale cache for (auto&& x : directory_iterator(".")) { lengthy_function(x.path()); // cache becomes stale x.refresh(); std::cout << x.path() << " " << x.last_write_time() << std::endl; }
В реализациях, которые не кэшируют время последней записи, оба цикла приведут к потенциально дорогостоящему вызову std::filesystem::last_write_time функции. В реализациях, которые кэшируют время последней записи, первый цикл будет использовать кешированное значение и поэтому не приведет к потенциально дорогостоящему вызову std::filesystem::last_write_time функции. Код переносим для любой реализации, независимо от того, использует ли он кеширование или нет. ] — end example
explicit directory_entry(const path& p);
directory_entry(const path& p, error_code& ec);
Postconditions: path() == p если ошибки не возникает, иначе path() == std::filesystem::path().
Throws: Как указано в [fs.err.report].
void assign(const path& p);
void assign(const path& p, error_code& ec);
Effects: Эквивалентно pathobject = p, then refresh() или refresh(ec), соответственно. В случае ошибки значения любых кэшированных атрибутов не указываются.
Throws: Как указано в [fs.err.report].
void replace_filename(const path& p);
void replace_filename(const path& p, error_code& ec);
Effects: Эквивалентно pathobject.replace_filename(p), then refresh() или refresh(ec), соответственно. В случае ошибки значения любых кэшированных атрибутов не указываются.
Throws: Как указано в [fs.err.report].
void refresh();
void refresh(error_code& ec) noexcept;
Effects: Сохраняет текущие значения любых кэшированных атрибутов файла, в который p разрешается. При возникновении ошибки сообщается об ошибке ([fs.err.report]), и значения любых кэшированных атрибутов не указываются.
Throws: Как указано в [fs.err.report].
[ Note: Реализациям directory_iterator ([fs.class.directory_iterator]) запрещено прямо или косвенно вызывать refresh функцию, поскольку она должна обращаться к внешней файловой системе, а цель кэширования - избежать ненужных обращений к файловой системе. ] — end note
Неквалифицированные имена функций в Returns: элементах directory_entry наблюдателей, описанных ниже, относятся к членам std::filesystem пространства имен.
const path& path() const noexcept;
operator const path&() const noexcept;
bool exists() const;
bool exists(error_code& ec) const noexcept;
Throws: Как указано в [fs.err.report].
bool is_block_file() const;
bool is_block_file(error_code& ec) const noexcept;
Throws: Как указано в [fs.err.report].
bool is_character_file() const;
bool is_character_file(error_code& ec) const noexcept;
Returns: is_character_file(this->status()) или is_character_file(this->status(), ec), соответственно.
Throws: Как указано в [fs.err.report].
bool is_directory() const;
bool is_directory(error_code& ec) const noexcept;
Throws: Как указано в [fs.err.report].
bool is_fifo() const;
bool is_fifo(error_code& ec) const noexcept;
Throws: Как указано в [fs.err.report].
bool is_other() const;
bool is_other(error_code& ec) const noexcept;
Throws: Как указано в [fs.err.report].
bool is_regular_file() const;
bool is_regular_file(error_code& ec) const noexcept;
Returns: is_regular_file(this->status()) или is_regular_file(this->status(), ec), соответственно.
Throws: Как указано в [fs.err.report].
bool is_socket() const;
bool is_socket(error_code& ec) const noexcept;
Throws: Как указано в [fs.err.report].
bool is_symlink() const;
bool is_symlink(error_code& ec) const noexcept;
Returns: is_symlink(this->symlink_status()) или is_symlink(this->symlink_status(), ec), соответственно.
Throws: Как указано в [fs.err.report].
uintmax_t file_size() const;
uintmax_t file_size(error_code& ec) const noexcept;
Returns: Если кэшировано, значение атрибута размера файла. В противном случае file_size(path()) или file_size(path(), ec)соответственно.
Throws: Как указано в [fs.err.report].
uintmax_t hard_link_count() const;
uintmax_t hard_link_count(error_code& ec) const noexcept;
Returns: Если кэшировано, значение атрибута количества жестких ссылок. В противном случае hard_link_count(path()) или hard_link_count(path(), ec)соответственно.
Throws: Как указано в [fs.err.report].
file_time_type last_write_time() const;
file_time_type last_write_time(error_code& ec) const noexcept;
Returns: Если кэшировано, последнее значение атрибута времени записи. В противном случае last_write_time(path()) или last_write_time(path(), ec)соответственно.
Throws: Как указано в [fs.err.report].
file_status status() const;
file_status status(error_code& ec) const noexcept;
Returns: Если кэшировано, значение атрибута статуса. В противном случае status(path()) или status(path(), ec)соответственно.
Throws: Как указано в [fs.err.report].
file_status symlink_status() const;
file_status symlink_status(error_code& ec) const noexcept;
Returns: Если кэшировано, значение атрибута статуса символической ссылки. В противном случае symlink_status(path()) или symlink_status(path(), ec)соответственно.
Throws: Как указано в [fs.err.report].
bool operator==(const directory_entry& rhs) const noexcept;
bool operator!=(const directory_entry& rhs) const noexcept;
bool operator< (const directory_entry& rhs) const noexcept;
bool operator<=(const directory_entry& rhs) const noexcept;
bool operator> (const directory_entry& rhs) const noexcept;
bool operator>=(const directory_entry& rhs) const noexcept;
Объект типа directory_iterator предоставляет итератор для последовательности directory_entry элементов, представляющих путь и любые кэшированные значения атрибутов ([fs.class.directory_entry]) для каждого файла в каталоге или в определяемом реализацией типе файла, подобном каталогу. [ Note: Для перехода к подкаталогам см. Class recursive_directory_iterator ([fs.class.rec.dir.itr]). ] — end note
namespace std::filesystem { class directory_iterator { public: using iterator_category = input_iterator_tag; using value_type = directory_entry; using difference_type = ptrdiff_t; using pointer = const directory_entry*; using reference = const directory_entry&; // [fs.dir.itr.members], member functions directory_iterator() noexcept; explicit directory_iterator(const path& p); directory_iterator(const path& p, directory_options options); directory_iterator(const path& p, error_code& ec) noexcept; directory_iterator(const path& p, directory_options options, error_code& ec) noexcept; directory_iterator(const directory_iterator& rhs); directory_iterator(directory_iterator&& rhs) noexcept; ~directory_iterator(); directory_iterator& operator=(const directory_iterator& rhs); directory_iterator& operator=(directory_iterator&& rhs) noexcept; const directory_entry& operator*() const; const directory_entry* operator->() const; directory_iterator& operator++(); directory_iterator& increment(error_code& ec) noexcept; // other members as required by [input.iterators], input iterators }; }
Если итератор типа directory_iterator сообщает об ошибке или проходит мимо последнего элемента каталога, этот итератор должен стать равным конечному значению итератора. Конструктор по directory_iterator умолчанию должен создать итератор, равный значению конечного итератора, и это должен быть единственный допустимый итератор для конечного условия.
Два конечных итератора всегда равны. Конечный итератор не должен быть равен нескончаемому итератору.
Результатом вызова path() члена directory_entry объекта, полученного путем разыменования a, directory_iterator является ссылка на path объект, состоящий из аргумента каталога, из которого был создан итератор, с именем файла записи каталога, добавленным, как если бы operator/=.
Итерация каталога не должна приводить к появлению записей каталога для каталогов current (dot) и parent (dot-dot).
Порядок записей каталога, полученных путем разыменования последовательных приращений a, directory_iterator не определен.
Конструкторы и неконстантные directory_iterator функции - члены хранят значения любых кэшированных атрибутов ([fs.class.directory_entry]) в directory_entry элементе, возвращаемом operator*(). directory_iterator функции-члены не должны прямо или косвенно вызывать какие-либо directory_entry refresh функции. [ Note: Точный механизм хранения кэшированных значений атрибутов не предоставляется пользователям. Для directory_iterator демонстрации класс показан [fs.class.directory_entry] как друг класса directory_entry. ] — end note
[ Note: Программы, выполняющие итерацию каталога, могут захотеть проверить, действительно ли существует путь, полученный путем разыменования итератора каталога. Это может быть символическая ссылка на несуществующий файл. Программы, рекурсивно проходящие по деревьям каталогов с целью удаления и переименования записей, могут не следовать символическим ссылкам. ] — end note
[ Note: Если файл удаляется из каталога или добавляется в каталог после создания a directory_iterator для каталога, не указано, приведет ли последующее увеличение итератора к тому, что итератор будет ссылаться на удаленную или добавленную запись каталога. См. POSIX readdir_r. ] — end note
directory_iterator() noexcept;
explicit directory_iterator(const path& p);
directory_iterator(const path& p, directory_options options);
directory_iterator(const path& p, error_code& ec) noexcept;
directory_iterator(const path& p, directory_options options, error_code& ec) noexcept;
Effects: Для каталога, который p разрешается в, создает итератор для первого элемента в последовательности directory_entry элементов, представляющих файлы в каталоге, если таковые имеются; в противном случае - конечный итератор. Однако если
(options & directory_options::skip_permission_denied) != directory_options::none
и конструкция обнаруживает ошибку, указывающую, что в доступе p отказано, создает конечный итератор и не сообщает об ошибке.
Throws: Как указано в [fs.err.report].
[ Note: Для перебора текущего каталога используйте directory_iterator(".") вместо directory_iterator(""). ] — end note
directory_iterator(const directory_iterator& rhs);
directory_iterator(directory_iterator&& rhs) noexcept;
directory_iterator& operator=(const directory_iterator& rhs);
directory_iterator& operator=(directory_iterator&& rhs) noexcept;
directory_iterator& operator++();
directory_iterator& increment(error_code& ec) noexcept;
Effects: Как указано для операции увеличения префикса Input iterators.
Throws: Как указано в [fs.err.report].
directory_iterator begin(directory_iterator iter) noexcept;
directory_iterator end(const directory_iterator&) noexcept;
Объект типа recursive_directory_iterator предоставляет итератор для последовательности directory_entry элементов, представляющих файлы в каталоге или в определяемом реализацией типе файла, подобном каталогу, и его подкаталогам.
namespace std::filesystem { class recursive_directory_iterator { public: using iterator_category = input_iterator_tag; using value_type = directory_entry; using difference_type = ptrdiff_t; using pointer = const directory_entry*; using reference = const directory_entry&; // [fs.rec.dir.itr.members], constructors and destructor recursive_directory_iterator() noexcept; explicit recursive_directory_iterator(const path& p); recursive_directory_iterator(const path& p, directory_options options); recursive_directory_iterator(const path& p, directory_options options, error_code& ec) noexcept; recursive_directory_iterator(const path& p, error_code& ec) noexcept; recursive_directory_iterator(const recursive_directory_iterator& rhs); recursive_directory_iterator(recursive_directory_iterator&& rhs) noexcept; ~recursive_directory_iterator(); // [fs.rec.dir.itr.members], observers directory_options options() const; int depth() const; bool recursion_pending() const; const directory_entry& operator*() const; const directory_entry* operator->() const; // [fs.rec.dir.itr.members], modifiers recursive_directory_iterator& operator=(const recursive_directory_iterator& rhs); recursive_directory_iterator& operator=(recursive_directory_iterator&& rhs) noexcept; recursive_directory_iterator& operator++(); recursive_directory_iterator& increment(error_code& ec) noexcept; void pop(); void pop(error_code& ec); void disable_recursion_pending(); // other members as required by [input.iterators], input iterators }; }
Вызов options, depth, recursion_pending, pop или disable_recursion_pending на итератора , который не разыменовываемое приводит к неопределенному поведению.
Поведение a recursive_directory_iterator такое же, как и для a, directory_iterator если не указано иное.
[ Note: Если структура каталогов, по которой выполняется итерация, содержит циклы, то конечный итератор может быть недоступен. ] — end note
recursive_directory_iterator() noexcept;
explicit recursive_directory_iterator(const path& p);
recursive_directory_iterator(const path& p, directory_options options);
recursive_directory_iterator(const path& p, directory_options options, error_code& ec) noexcept;
recursive_directory_iterator(const path& p, error_code& ec) noexcept;
Effects: Создает итератор, представляющий первую запись в каталоге, в который p разрешается, если есть; в противном случае - конечный итератор. Однако если
(options & directory_options::skip_permission_denied) != directory_options::none
и конструкция обнаруживает ошибку, указывающую, что в доступе p отказано, создает конечный итератор и не сообщает об ошибке.
Postconditions: options() == options для подписей с directory_options аргументом, иначе options() == directory_options::none.
Throws: Как указано в [fs.err.report].
[ Note: Для перебора текущего каталога используйте recursive_directory_iterator(".") вместо recursive_directory_iterator(""). ] — end note
[ Note: По умолчанию recursive_directory_iterator не следует символическим ссылкам на каталоги. Чтобы следовать символическим ссылкам каталога, укажите options как ] directory_options::follow_directory_symlink — end note
recursive_directory_iterator(const recursive_directory_iterator& rhs);
recursive_directory_iterator(recursive_directory_iterator&& rhs) noexcept;
Postconditions: options(), depth()И recursion_pending() имеет значение , которые rhs.options(), rhs.depth()и rhs.recursion_pending(), соответственно, имели перед вызовом функции.
recursive_directory_iterator& operator=(const recursive_directory_iterator& rhs);
recursive_directory_iterator& operator=(recursive_directory_iterator&& rhs) noexcept;
Postconditions: options(), depth()И recursion_pending() имеет значение , которые rhs.options(), rhs.depth()и rhs.recursion_pending(), соответственно, имели перед вызовом функции.
directory_options options() const;
Returns: Значение аргумента, переданного конструктору для options параметра, если он присутствует, в противном случае directory_options::none.
int depth() const;
Returns: Текущая глубина просматриваемого дерева каталогов. [ Note: Начальный каталог - это глубина 0, его непосредственные подкаталоги - это глубина 1и так далее. ] — end note
bool recursion_pending() const;
Returns: true if disable_recursion_pending() не был вызван после предыдущей операции построения или приращения, в противном случае false.
recursive_directory_iterator& operator++();
recursive_directory_iterator& increment(error_code& ec) noexcept;
Effects: Как указано для операции увеличения префикса Input iterators, за исключением того, что:
Если на текущей глубине больше нет записей, то если depth() != 0 итерация по родительскому каталогу возобновляется; иначе *this = recursive_directory_iterator().
В противном случае, если
recursion_pending() && is_directory((*this)->status()) && (!is_symlink((*this)->symlink_status()) || (options() & directory_options::follow_directory_symlink) != directory_options::none)
то либо каталог (*this)->path() рекурсивно перебирается, либо, если
(options() & directory_options::skip_permission_denied) != directory_options::none
и возникает ошибка, указывающая на то, что в разрешении на доступ к каталогу (*this)->path() отказано, тогда каталог (*this)->path() обрабатывается как пустой каталог и об ошибках не сообщается.
Throws: Как указано в [fs.err.report].
void pop();
void pop(error_code& ec);
Effects: Если depth() == 0установите *this в recursive_directory_iterator(). В противном случае прекратите итерацию каталога, по которому в настоящее время выполняется итерация, и продолжите итерацию по родительскому каталогу.
Throws: Как указано в [fs.err.report].
void disable_recursion_pending();
Эти функции позволяют использовать recursive_directory_iterator операторы for на основе диапазона.
recursive_directory_iterator begin(recursive_directory_iterator iter) noexcept;
recursive_directory_iterator end(const recursive_directory_iterator&) noexcept;
Функции работы с файловой системой запрашивают или изменяют файлы, включая каталоги, во внешнем хранилище.
[ Note: Поскольку file system racesпри операциях файловой системы часто возникают сбои оборудования, сбои сети и многие другие виды ошибок, пользователи должны знать, что любая функция операции с файловой системой, независимо от того, насколько она кажется безобидной, может столкнуться с ошибкой; см [fs.err.report]. ] — end note
path absolute(const path& p);
path absolute(const path& p, error_code& ec);
Effects: Создает абсолютный путь, ссылающийся на то же расположение файловой системы, что p и в операционной системе ([fs.conform.os]).
[ Note: Для возвращаемого пути, rp, rp.is_absolute() является , true если не возникает ошибка. ] — end note
Throws: Как указано в [fs.err.report].
[ Note: Чтобы разрешить символические ссылки или выполнить другую очистку, которая может потребовать запросов к вторичному хранилищу, например жестким дискам, рассмотреть canonical ([fs.op.canonical]). ] — end note
[ Note: Реализациям настоятельно рекомендуется не запрашивать вторичное хранилище и не рассматривать !exists(p) ошибку. ] — end note
path canonical(const path& p, const path& base = current_path());
path canonical(const path& p, error_code& ec);
path canonical(const path& p, const path& base, error_code& ec);
Effects: Преобразует p, который должен существовать, в абсолютный путь без символической ссылки dotили dot-dot элементов в имени пути в универсальном формате.
Returns: Путь, который относится к тому же объекту файловой системы, что и absolute(p, base). Для перегрузки без base аргумента base есть current_path(). Подписи с аргументом ec возвращаются в path() случае ошибки.
Throws: Как указано в [fs.err.report].
void copy(const path& from, const path& to);
void copy(const path& from, const path& to, error_code& ec) noexcept;
void copy(const path& from, const path& to, copy_options options);
void copy(const path& from, const path& to, copy_options options,
error_code& ec) noexcept;
Requires: [fs.enum.copy.opts]Устанавливается не более одного элемента из каждой группы опций ( ) options.
Effects: Перед первым применением f и t:
Если
(options & copy_options::create_symlinks) != copy_options::none || (options & copy_options::skip_symlinks) != copy_options::none
тогда auto f = symlink_status(from) и при необходимости auto t = symlink_status(to).
В противном случае, если
(options & copy_options::copy_symlinks) != copy_options::none
тогда auto f = symlink_status(from) и при необходимости auto t = status(to).
В противном случае auto f = status(from) и при необходимости auto t = status(to).
Эффекты тогда следующие:
Если f.type() или t.type() является типом файла, определяемым реализацией ([fs.enum.file_type]), то эффекты определяются реализацией.
В противном случае сообщается об ошибке, как указано в [fs.err.report] if:
!exists(f), или
equivalent(from, to), или
is_other(f) || is_other(t), или
is_directory(f) && is_regular_file(t).
В противном случае, если is_symlink(f), то:
Если (options & copy_options::skip_symlinks) != copy_options::none потом вернемся.
В противном случае, если
!exists(t) && (options & copy_options::copy_symlinks) != copy_options::none
тогда copy_symlink(from, to).
В противном случае сообщите об ошибке, как указано в [fs.err.report].
В противном случае, если is_regular_file(f), то:
Если (options & copy_options::directories_only) != copy_options::none, то вернись.
В противном случае, если (options & copy_options::create_symlinks) != copy_options::none, то создайте символическую ссылку на исходный файл.
В противном случае, если (options & copy_options::create_hard_links) != copy_options::none, то создайте жесткую ссылку на исходный файл.
Иначе если is_directory(t), то copy_file(from, to/from.filename(), options).
В противном случае copy_file(from, to, options).
В противном случае, если
is_directory(f) && ((options & copy_options::recursive) != copy_options::none || options == copy_options::none)
тогда:
Если !exists(t), то create_directory(to, from).
Затем перейдите по файлам from, как если бы
for (const directory_entry& x : directory_iterator(from))
copy(x.path(), to/x.path().filename(), options | copy_options::unspecified)
В противном случае, для подписи с аргументом ec, ec.clear().
В остальном никаких эффектов.
Throws: Как указано в [fs.err.report].
Remarks: Для подписи с аргументом ecлюбые библиотечные функции, вызываемые реализацией, должны иметь error_code аргумент, если это применимо.
[ Example: Учитывая эту структуру каталогов:
/dir1 file1 file2 dir2 file3
Вызов copy("/dir1", "/dir3") приведет к:
/dir1 file1 file2 dir2 file3 /dir3 file1 file2
В качестве альтернативы вызов copy("/dir1", "/dir3", copy_options::recursive) может привести к:
/dir1 file1 file2 dir2 file3 /dir3 file1 file2 dir2 file3
— end example ]
bool copy_file(const path& from, const path& to);
bool copy_file(const path& from, const path& to, error_code& ec) noexcept;
Returns: copy_file(from, to, copy_options::none) или
copy_file(from, to, copy_options::none, ec), соответственно.
Throws: Как указано в [fs.err.report].
bool copy_file(const path& from, const path& to, copy_options options);
bool copy_file(const path& from, const path& to, copy_options options,
error_code& ec) noexcept;
Requires: [fs.enum.copy.opts]Устанавливается не более одного элемента из каждой группы опций ( ) options.
Effects: Следующее:
Сообщить об ошибке, что файл уже существует, [fs.err.report] если:
!is_regular_file(from), или
exists(to) и !is_regular_file(to), или
exists(to) и equivalent(from, to), или
exists(to) а также
(options & (copy_options::skip_existing | copy_options::overwrite_existing | copy_options::update_existing)) == copy_options::none
В противном случае скопируйте содержимое и атрибуты файла, в который from разрешается, в файл, в который to разрешается, если:
!exists(to), или
(options & copy_options::overwrite_existing) != copy_options::none, или
(options & copy_options::update_existing) != copy_options::none и from является более поздним, чем toопределяется, как если бы с использованием last_write_time функции ([fs.op.last_write_time]).
В остальном никаких эффектов.
Returns: true если from файл был скопирован, иначе false. Подпись с аргументом ec возвращается, false если возникает ошибка.
Throws: Как указано в [fs.err.report].
void copy_symlink(const path& existing_symlink, const path& new_symlink);
void copy_symlink(const path& existing_symlink, const path& new_symlink,
error_code& ec) noexcept;
Effects: Эквивалент
function(read_symlink(existing_symlink), new_symlink) или
function(read_symlink(existing_symlink, ec), new_symlink, ec), соответственно, где в каждом случае function является create_symlink или
create_directory_symlink в зависимости от обстоятельств.
Throws: Как указано в [fs.err.report].
bool create_directories(const path& p);
bool create_directories(const path& p, error_code& ec) noexcept;
Returns: true если был создан новый каталог, иначе false. Подпись с аргументом ec возвращается, false если возникает ошибка.
Throws: Как указано в [fs.err.report].
bool create_directory(const path& p);
bool create_directory(const path& p, error_code& ec) noexcept;
Effects: Устанавливает постусловие, пытаясь создать каталог, в который p разрешается, как если бы POSIX mkdir() со вторым аргументом static_cast<int>(perms::all). Ошибка создания из- p за преобразования в существующий каталог не должна рассматриваться как ошибка.
Returns: true если был создан новый каталог, иначе false. Подпись с аргументом ec возвращается, false если возникает ошибка.
Throws: Как указано в [fs.err.report].
bool create_directory(const path& p, const path& existing_p);
bool create_directory(const path& p, const path& existing_p, error_code& ec) noexcept;
Effects: Устанавливает постусловие, пытаясь создать каталог, в который p разрешается, с атрибутами, скопированными из каталога existing_p. Набор копируемых атрибутов зависит от операционной системы. Ошибка создания из- p за преобразования в существующий каталог не должна рассматриваться как ошибка. [ Note: Для операционных систем на базе POSIX это те атрибуты, которые копируются собственным API, stat(existing_p.c_str(), &attributes_stat) за которыми следует mkdir(p.c_str(), attributes_stat.st_mode). Для операционных систем на базе Windows атрибуты копируются собственным API CreateDirectoryExW(existing_p.c_str(), p.c_str(), 0). ] — end note
Returns: true если был создан новый каталог, иначе false. Подпись с аргументом ec возвращается, false если возникает ошибка.
Throws: Как указано в [fs.err.report].
void create_directory_symlink(const path& to, const path& new_symlink);
void create_directory_symlink(const path& to, const path& new_symlink,
error_code& ec) noexcept;
Postconditions: new_symlink преобразуется в файл символьной ссылки, который содержит неопределенное представление to.
Throws: Как указано в [fs.err.report].
[ Note: Некоторые операционные системы требуют создания символической ссылки, чтобы идентифицировать ссылку на каталог. Переносимый код следует использовать create_directory_symlink() для создания символических ссылок на каталоги, а не ] create_symlink() — end note
void create_hard_link(const path& to, const path& new_hard_link);
void create_hard_link(const path& to, const path& new_hard_link,
error_code& ec) noexcept;
Throws: Как указано в [fs.err.report].
[ Note: Некоторые операционные системы вообще не поддерживают жесткие ссылки или поддерживают их только для обычных файлов. Некоторые файловые системы (например, файловая система FAT) не поддерживают жесткие ссылки независимо от операционной системы. Некоторые файловые системы ограничивают количество ссылок на файл. ] — end note
void create_symlink(const path& to, const path& new_symlink);
void create_symlink(const path& to, const path& new_symlink,
error_code& ec) noexcept;
Postconditions: new_symlink преобразуется в файл символьной ссылки, который содержит неопределенное представление to.
Throws: Как указано в [fs.err.report].
path current_path();
path current_path(error_code& ec);
Returns: Абсолютный путь к текущему рабочему каталогу, имя которого в собственном формате получается, как если бы POSIX getcwd(). Подпись с аргументом ec возвращается, path() если возникает ошибка.
Throws: Как указано в [fs.err.report].
Remarks: Текущий рабочий каталог - это каталог, связанный с процессом, который используется в качестве начального местоположения при разрешении путей для относительных путей.
[ Название было выбрано , чтобы подчеркнуть , что возвращаемое значение представляет собой путь, а не только одно имя каталога. ] Note: current_path() — end note
[ Note: Текущий путь, возвращаемый многими операционными системами, является опасной глобальной переменной. Он может быть неожиданно изменен сторонними функциями, функциями системной библиотеки или другим потоком. ] — end note
void current_path(const path& p);
void current_path(const path& p, error_code& ec) noexcept;
Throws: Как указано в [fs.err.report].
bool equivalent(const path& p1, const path& p2);
bool equivalent(const path& p1, const path& p2, error_code& ec) noexcept;
Effects: Определяет s1 и s2. Если (!exists(s1) && !exists(s2)) || (is_other(s1) && is_other(s2)) сообщается об ошибке ([fs.err.report]).
Returns: true, если s1 == s2 и p1 и p2 разрешаются в один и тот же объект файловой системы, иначе false. Подпись с аргументом ec возвращается, false если возникает ошибка.
Считается, что два пути разрешаются к одному и тому же объекту файловой системы, если два объекта-кандидата находятся на одном устройстве в одном месте. Это определяется, как если бы, значениями stat структуры POSIX , полученными, как если бы, stat() для двух путей, имеющих равные st_dev значения и равные st_ino значения.
Throws: Как указано в [fs.err.report].
bool exists(file_status s) noexcept;
bool exists(const path& p);
bool exists(const path& p, error_code& ec) noexcept;
Позвольте s быть a file_status, определяемым, как если бы по status(p) или status(p, ec), соответственно.
Throws: Как указано в [fs.err.report].
uintmax_t file_size(const path& p);
uintmax_t file_size(const path& p, error_code& ec) noexcept;
Returns:
Если !exists(p) сообщается об ошибке ([fs.err.report]).
В противном случае, если is_regular_file(p), размер файла в байтах p преобразуется в, определяемый, как если бы, значением элемента stat структуры POSIX, st_size полученным, как если бы POSIX stat().
Подпись с аргументом ec возвращается, static_cast<uintmax_t>(-1) если возникает ошибка.
Throws: Как указано в [fs.err.report].
uintmax_t hard_link_count(const path& p);
uintmax_t hard_link_count(const path& p, error_code& ec) noexcept;
Returns: Количество жестких ссылок для p. Подпись с аргументом ec возвращается, static_cast<uintmax_t>(-1) если возникает ошибка.
Throws: Как указано в [fs.err.report].
bool is_block_file(file_status s) noexcept;
bool is_block_file(const path& p);
bool is_block_file(const path& p, error_code& ec) noexcept;
Returns: is_block_file(status(p)) или is_block_file(status(p, ec)), соответственно. Подпись с аргументом ec возвращается, false если возникает ошибка.
Throws: Как указано в [fs.err.report].
bool is_character_file(file_status s) noexcept;
bool is_character_file(const path& p);
bool is_character_file(const path& p, error_code& ec) noexcept;
Returns: is_character_file(status(p))
или is_character_file(status(p, ec)), соответственно.
Подпись с аргументом ec возвращается, false
если возникает ошибка.
Throws: Как указано в [fs.err.report].
bool is_directory(file_status s) noexcept;
bool is_directory(const path& p);
bool is_directory(const path& p, error_code& ec) noexcept;
Returns: is_directory(status(p)) или is_directory(status(p, ec)), соответственно. Подпись с аргументом ec возвращается, false если возникает ошибка.
Throws: Как указано в [fs.err.report].
bool is_empty(const path& p);
bool is_empty(const path& p, error_code& ec) noexcept;
Effects:
Определяем file_status s, как будто по status(p) или status(p, ec), соответственно.
Для подписи с аргументом ecвернуть, false если произошла ошибка.
В противном случае, если is_directory(s):
Создайте переменную itr, как будто по directory_iterator itr(p) или directory_iterator itr(p, ec), соответственно.
Для подписи с аргументом ecвернуть, false если произошла ошибка.
В противном случае верните itr == directory_iterator().
Иначе:
Определяем uintmax_t sz, как будто по file_size(p) или file_size(p, ec), соответственно.
Для подписи с аргументом ecвернуть, false если произошла ошибка.
В противном случае верните sz == 0.
Throws: Как указано в [fs.err.report].
bool is_fifo(file_status s) noexcept;
bool is_fifo(const path& p);
bool is_fifo(const path& p, error_code& ec) noexcept;
Returns: is_fifo(status(p)) или is_fifo(status(p, ec)), соответственно. Подпись с аргументом ec возвращается, false если возникает ошибка.
Throws: Как указано в [fs.err.report].
bool is_other(file_status s) noexcept;
bool is_other(const path& p);
bool is_other(const path& p, error_code& ec) noexcept;
Returns: is_other(status(p)) или is_other(status(p, ec)), соответственно. Подпись с аргументом ec возвращается, false если возникает ошибка.
Throws: Как указано в [fs.err.report].
bool is_regular_file(file_status s) noexcept;
bool is_regular_file(const path& p);
bool is_regular_file(const path& p, error_code& ec) noexcept;
Effects: Устанавливает ec как бы мимо status(p, ec). [ Note: file_type::none, file_type::not_found и для file_type::unknown случаев установлены ec значения ошибок. Чтобы различать случаи, вызовите status функцию напрямую. ] — end note
bool is_socket(file_status s) noexcept;
bool is_socket(const path& p);
bool is_socket(const path& p, error_code& ec) noexcept;
Returns: is_socket(status(p)) или is_socket(status(p, ec)), соответственно. Подпись с аргументом ec возвращается, false если возникает ошибка.
Throws: Как указано в [fs.err.report].
bool is_symlink(file_status s) noexcept;
bool is_symlink(const path& p);
bool is_symlink(const path& p, error_code& ec) noexcept;
Returns: is_symlink(symlink_status(p)) или is_symlink(symlink_status(p, ec)), соответственно. Подпись с аргументом ec возвращается, false если возникает ошибка.
Throws: Как указано в [fs.err.report].
file_time_type last_write_time(const path& p);
file_time_type last_write_time(const path& p, error_code& ec) noexcept;
Returns: Время последней модификации данных p, определяемое, как если бы, значением stat члена структуры POSIX, st_mtime полученным, как если бы POSIX stat(). Подпись с аргументом ec возвращается, file_time_type::min() если возникает ошибка.
Throws: Как указано в [fs.err.report].
void last_write_time(const path& p, file_time_type new_time);
void last_write_time(const path& p, file_time_type new_time,
error_code& ec) noexcept;
Effects: Устанавливает время последнего изменения данных файла, разрешенного с помощью p to new_time, как если бы POSIX futimens().
Throws: Как указано в [fs.err.report].
void permissions(const path& p, perms prms, perm_options opts=perm_options::replace);
void permissions(const path& p, perms prms, error_code& ec) noexcept;
void permissions(const path& p, perms prms, perm_options opts, error_code& ec);
Remarks: Вторая подпись ведет себя так, как если бы у нее был дополнительный параметр perm_options opts с аргументом perm_options::replace.
Effects: Применяет действие, указанное в, opts к p разрешению файла или к p самому файлу , если p это символическая ссылка и perm_options::nofollow установлена в opts. Действие применяется, как если бы POSIX fchmodat().
[ Note: Концептуально разрешения рассматриваются как биты, но фактическая реализация может использовать какой-то другой механизм. ] — end note
Throws: Как указано в [fs.err.report].
path proximate(const path& p, error_code& ec);
Throws: Как указано в [fs.err.report].
path proximate(const path& p, const path& base = current_path());
path proximate(const path& p, const path& base, error_code& ec);
Returns: Для первой формы:
weakly_canonical(p).lexically_proximate(weakly_canonical(base));
Для второй формы:
weakly_canonical(p, ec).lexically_proximate(weakly_canonical(base, ec));
или path() при первом возникновении ошибки, если таковая имеется.
Throws: Как указано в [fs.err.report].
path read_symlink(const path& p);
path read_symlink(const path& p, error_code& ec);
Returns: Если p разрешает символическую ссылку, path объект, содержащий содержимое этой символической ссылки. Подпись с аргументом ec возвращается, path() если возникает ошибка.
Throws: Как указано в [fs.err.report]. [ Note: Это ошибка, если p не разрешается символическая ссылка. ] — end note
path relative(const path& p, error_code& ec);
Throws: Как указано в [fs.err.report].
path relative(const path& p, const path& base = current_path());
path relative(const path& p, const path& base, error_code& ec);
Returns: Для первой формы:
weakly_canonical(p).lexically_relative(weakly_canonical(base));
Для второй формы:
weakly_canonical(p, ec).lexically_relative(weakly_canonical(base, ec));
или path() при первом возникновении ошибки, если таковая имеется.
Throws: Как указано в [fs.err.report].
bool remove(const path& p);
bool remove(const path& p, error_code& ec) noexcept;
Effects: Если exists(symlink_status(p, ec)), файл p удаляется, как если бы POSIX remove(). [ Note: Символическая ссылка удаляется сама по себе, а не файл, в который она разрешается. ] — end note
Returns: false если p не существовало, иначе true. Подпись с аргументом ec возвращается, false если возникает ошибка.
Throws: Как указано в [fs.err.report].
uintmax_t remove_all(const path& p);
uintmax_t remove_all(const path& p, error_code& ec) noexcept;
Effects: Рекурсивно удаляет содержимое, p если оно существует, затем удаляет p сам файл , как если бы это было POSIX remove(). [ Note: Символическая ссылка удаляется сама по себе, а не файл, в который она разрешается. ] — end note
Returns: Количество удаленных файлов. Подпись с аргументом ec возвращается, static_cast< uintmax_t>(-1) если возникает ошибка.
Throws: Как указано в [fs.err.report].
void rename(const path& old_p, const path& new_p);
void rename(const path& old_p, const path& new_p, error_code& ec) noexcept;
Effects: Переименовывает old_p в new_p, как если бы POSIX rename().
[ Note:
Если old_p и new_p разрешаются в один и тот же существующий файл, никаких действий не предпринимается.
В противном случае переименование может включать следующие эффекты:
если new_p разрешается в существующий файл, не new_p являющийся каталогом, удаляется; иначе,
если new_p разрешается в существующий каталог, new_p удаляется, если он пуст в POSIX-совместимых операционных системах, но может быть ошибкой в других операционных системах.
Сама символическая ссылка переименовывается, а не файл, в который она разрешается. ] — end note
Throws: Как указано в [fs.err.report].
void resize_file(const path& p, uintmax_t new_size);
void resize_file(const path& p, uintmax_t new_size, error_code& ec) noexcept;
Throws: Как указано в [fs.err.report].
space_info space(const path& p);
space_info space(const path& p, error_code& ec) noexcept;
Returns: Тип объекта space_info. Значение space_info объекта определяется как если при использовании POSIX statvfs для получения POSIX struct statvfs, а затем умножения его f_blocks, f_bfreeи f_bavail членов его f_frsize членами, и присвоения результатов к capacity, freeи available членов соответственно. Любые элементы, для которых невозможно определить значение, должны быть установлены в static_cast<uintmax_t>(-1). Для подписи с аргументом ecвсе члены устанавливаются в значение, static_cast<uintmax_t>(-1) если возникает ошибка.
Throws: Как указано в [fs.err.report].
file_status status(const path& p);
Effects: Будто:
error_code ec;
file_status result = status(p, ec);
if (result.type() == file_type::none)
throw filesystem_error(implementation-supplied-message, p, ec);
return result;
Throws: filesystem_error. [ Note: result значения file_status(file_type::not_found) и file_status(file_type::unknown) не считаются ошибками и не вызывают исключения. ] — end note
file_status status(const path& p, error_code& ec) noexcept;
Effects: Если возможно, определяет атрибуты файла, в который p разрешается, как если бы с помощью POSIX stat() для получения POSIX struct stat. Если во время определения атрибута API базовой файловой системы сообщает об ошибке, устанавливается, ec чтобы указать конкретную сообщенную ошибку. В противном случае ec.clear(). [ Note: Это позволяет пользователям проверять особенности основных ошибок API, даже если значение, возвращаемое функцией status() , не является file_status(file_type::none). ] — end note
Пусть prms обозначает результат (m & perms::mask), где m определяется как бы преобразованием st_mode члена полученного struct stat в тип perms.
Returns:
Если ec != error_code():
Если конкретная ошибка указывает, что p не может быть разрешена, потому что какой-то элемент пути не существует, возвращается file_status(file_type::not_found).
В противном случае, если конкретная ошибка указывает, что она p может быть устранена, но атрибуты не могут быть определены, возвращается file_status(file_type::unknown).
В противном случае возвращается file_status(file_type::none).
[ Note: Эта семантика различает то, p что известно, что не существует, p существует, но не может определить свои атрибуты, и есть ошибка, которая не позволяет даже узнать, p существует ли . Эти различия важны для некоторых случаев использования. ] — end note
Иначе,
Если атрибуты указывают на обычный файл, как если бы это было POSIX S_ISREG, возвращается file_status(file_type::regular, prms). [ Note: file_type::regular подразумевает, что соответствующие <fstream> операции будут успешными, при условии отсутствия ошибок оборудования, разрешений, доступа или гонок файловой системы. Отсутствие file_type::regular не обязательно означает, что <fstream> операции с каталогом завершатся ошибкой. ] — end note
В противном случае, если атрибуты указывают каталог, как если бы это было POSIX S_ISDIR, возвращается file_status(file_type::directory, prms). [ Note: file_type::directory подразумевает, что вызов directory_iterator(p) будет успешным. ] — end note
В противном случае, если атрибуты указывают на блокировку специального файла, как если бы это было POSIX S_ISBLK, возвращается file_status(file_type::block, prms).
В противном случае, если атрибуты указывают на символьный специальный файл, как если бы это было POSIX S_ISCHR, возвращается file_status(file_type::character, prms).
В противном случае, если атрибуты указывают на файл fifo или pipe, как если бы это был POSIX S_ISFIFO, возвращается file_status(file_type::fifo, prms).
В противном случае, если атрибуты указывают сокет, как если бы это было согласно POSIX S_ISSOCK, возвращается file_status(file_type::socket, prms).
В противном случае, если атрибуты указывают тип файла, определенный реализацией ([fs.enum.file_type]), возвращается file_status(file_type::A, prms), где A - константа для типа файла, определенного реализацией.
В противном случае возвращается file_status(file_type::unknown, prms).
bool status_known(file_status s) noexcept;
file_status symlink_status(const path& p);
file_status symlink_status(const path& p, error_code& ec) noexcept;
Effects: То же, что status()и выше, за исключением того, что атрибуты p определяются, как если бы при использовании POSIX lstat() для получения POSIX struct stat.
Пусть prms обозначает результат (m & perms::mask), где m определяется как бы преобразованием st_mode члена полученного struct stat в тип perms.
Returns: То же, что status()и выше, за исключением того, что если атрибуты указывают на символическую ссылку, как если бы это было в POSIX S_ISLNK, возвращается file_status(file_type::symlink, prms). Подпись с аргументом ec возвращается, file_status(file_type::none) если возникает ошибка.
Throws: Как указано в [fs.err.report].
path temp_directory_path();
path temp_directory_path(error_code& ec);
Returns: Неуказанный путь к каталогу, подходящий для временных файлов. Об ошибке должно быть сообщено, если !exists(p) || !is_directory(p), где p - путь, который должен быть возвращен. Подпись с аргументом ec возвращается, path() если возникает ошибка.
Throws: Как указано в [fs.err.report].
[ Example: Для POSIX на основе операционных систем, реализация может вернуть путь , поставляемый по первой переменной окружения , найденной в списке TMPDIR, TMP, TEMP, TEMPDIR, или если ни один из них не будут найдены, "/tmp".
Для операционных систем на базе Windows реализация может возвращать путь, указанный GetTempPath функцией Windows API. ] — end example
path weakly_canonical(const path& p);
path weakly_canonical(const path& p, error_code& ec);
Returns: p с разрешенными символическими ссылками и результатом normalized.
Effects: Используя status(p) или status(p, ec), соответственно, для определения существования, вернуть путь, составленный operator/= из результата вызова canonical() без base аргумента и с аргументом пути, состоящим из ведущих элементов, p которые существуют, если есть, за которыми следуют элементы, p которые не существуют, если любой. Для первой формы canonical() вызывается без error_code аргумента. Во второй форме, canonical() вызывается с ec как error_code аргумент, и path() возвращается на первом возникновении ошибки, если таковые имеются.
Postconditions: Возвращенный путь находится в normal form.
Remarks: Реализациям рекомендуется избегать ненужной нормализации, например, когда canonical уже была вызвана целиком p.
Throws: Как указано в [fs.err.report].