std::filesystem::create_directory, std::filesystem::create_directories
Определено в заголовочном файле <filesystem> | ||
|---|---|---|
bool create_directory( const std::filesystem::path& p ); | (1) | (начиная с C++17) |
bool create_directory( const std::filesystem::path& p, std::error_code& ec ) noexcept; | (2) | (начиная с C++17) |
bool create_directory( const std::filesystem::path& p,
const std::filesystem::path& existing_p );
| (3) | (начиная с C++17) |
bool create_directory( const std::filesystem::path& p,
const std::filesystem::path& existing_p,
std::error_code& ec ) noexcept;
| (4) | (начиная с C++17) |
bool create_directories( const std::filesystem::path& p ); | (5) | (начиная с C++17) |
bool create_directories( const std::filesystem::path& p, std::error_code& ec ); | (6) | (начиная с C++17) |
1,2) Создаёт каталог
p так же, как это делает POSIX mkdir() со вторым аргументом static_cast<int>(std::filesystem::perms::all) (родительский каталог уже должен существовать). Если функция завершается с ошибкой, потому что p разрешается в существующий каталог, ошибка не сообщается. В противном случае при ошибке она сообщается.
3,4) То же, что и (1,2), за исключением того, что атрибуты нового каталога копируются из
existing_p (который должен быть существующим каталогом). Копируемые атрибуты зависят от операционной системы: в системах POSIX атрибуты копируются так же, как это делает stat(existing_p.c_str(), &attributes_stat) mkdir(p.c_str(), attributes_stat.st_mode)В ОС Windows атрибуты
existing_p не копируются.
5,6) Выполняет (1,2) для каждого элемента
p, который ещё не существует. Если p уже существует, функция ничего не делает (это условие не считается ошибкой).Параметры
| p | - | путь к создаваемому каталогу |
| existing_p | - | путь к каталогу, атрибуты которого следует скопировать |
| ec | - | выходной параметр для сообщения об ошибках в невыбрасывающей исключения перегрузке |
Возвращаемое значение
true, если каталог был создан для пути, в который разрешается p, и false в противном случае.
Исключения
Любая перегрузка, не помеченная как noexcept, может выбросить std::bad_alloc при сбое выделения памяти.
1,5) Выбрасывает
std::filesystem::filesystem_error при ошибках базового API ОС; исключение создаётся с p в качестве первого аргумента-пути и кодом ошибки ОС в качестве аргумента кода ошибки.
2,6) Устанавливает параметр
std::error_code& в код ошибки API ОС, если вызов API ОС завершается с ошибкой, и выполняет ec.clear(), если ошибок нет.
3) Выбрасывает
std::filesystem::filesystem_error при ошибках базового API ОС; исключение создаётся с p в качестве первого аргумента-пути, existing_p в качестве второго аргумента-пути и кодом ошибки ОС в качестве аргумента кода ошибки.
4) Устанавливает параметр
std::error_code& в код ошибки API ОС, если вызов API ОС завершается с ошибкой, и выполняет ec.clear(), если ошибок нет.Примечания
Перегрузка с сохранением атрибутов (3,4) неявно вызывается функцией copy() при рекурсивном копировании каталогов. Её аналог в boost.filesystem — copy_directory (аргументы передаются в обратном порядке).
Пример
#include <cassert>
#include <cstdlib>
#include <filesystem>
int main()
{
std::filesystem::current_path(std::filesystem::temp_directory_path());
// Basic usage
std::filesystem::create_directories("sandbox/1/2/a");
std::filesystem::create_directory("sandbox/1/2/b");
// Directory already exists (false returned, no error)
assert(!std::filesystem::create_directory("sandbox/1/2/b"));
// Permissions copying usage
std::filesystem::permissions(
"sandbox/1/2/b",
std::filesystem::perms::others_all,
std::filesystem::perm_options::remove
);
std::filesystem::create_directory("sandbox/1/2/c", "sandbox/1/2/b");
std::system("ls -l sandbox/1/2");
std::system("tree sandbox");
std::filesystem::remove_all("sandbox");
}
Возможный вывод:
drwxr-xr-x 2 user group 4096 Apr 15 09:33 a
drwxr-x--- 2 user group 4096 Apr 15 09:33 b
drwxr-x--- 2 user group 4096 Apr 15 09:33 c
sandbox
└── 1
└── 2
├── a
├── b
└── c
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены задним числом к ранее опубликованным стандартам C++.
| DR | Применён к | Опубликованное поведение | Правильное поведение |
|---|---|---|---|
| LWG 2935 | C++17 | ошибка, если целевой объект уже существует, но не является каталогом | не ошибка |
| LWG 3014 | C++17 |
error_code перегрузка create_directories помечена noexcept, но может выделять память | noexcept удалён |
| P1164R1 | C++17 | сбой создания из-за существующего файла, не являющегося каталогом, не считается ошибкой | считается ошибкой |
См. также
|
(C++17)(C++17) | создаёт символическую ссылку (функция) |
|
(C++17) | копирует файлы или каталоги (функция) |
|
(C++17) | определяет права доступа к файловой системе (перечисление) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/filesystem/create_directory