Namespaces
Variants

std::filesystem:: create_directory, std::filesystem:: create_directories

From cppreference.net
Определено в заголовочном файле <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());
    // Базовое использование
    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)
определяет права доступа файловой системы
(перечисление)