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,
|
(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) |
mkdir()
со вторым аргументом
static_cast
<
int
>
(
std::
filesystem
::
perms
::
all
)
(родительская директория должна уже существовать). Если функция завершается неудачно, потому что
p
указывает на существующую директорию, ошибка не сообщается. В остальных случаях при неудаче сообщается об ошибке.
stat(existing_p.c_str(), &attributes_stat) mkdir(p.c_str(), attributes_stat.st_mode)
Содержание |
Параметры
| p | - | путь к новой создаваемой директории |
| existing_p | - | путь к директории, из которой копируются атрибуты |
| ec | - | выходной параметр для сообщения об ошибках в непорождающей исключения перегрузке |
Возвращаемое значение
true если каталог был создан заново для директории, p на которую указывает путь, false в противном случае.
Исключения
Любая перегрузка, не помеченная
noexcept
, может выбрасывать
std::bad_alloc
при неудачном выделении памяти.
Примечания
Перегрузка, сохраняющая атрибуты
(3,4)
неявно вызывается функцией
copy()
при рекурсивном копировании директорий. Её эквивалентом в boost.filesystem является
copy_directory
(с обратным порядком аргументов).
Пример
#include <cassert> #include <cstdlib> #include <filesystem> int main() { std::filesystem::current_path(std::filesystem::temp_directory_path()); // Базовое использование std::filesystem::create_directories("sandbox/1/2/a"); std::filesystem::create_directory("sandbox/1/2/b"); // Директория уже существует (возвращается false, ошибки нет) assert(!std::filesystem::create_directory("sandbox/1/2/b")); // Использование копирования прав доступа 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)
|
определяет права доступа файловой системы
(перечисление) |