Spec-Zone.ru › C++

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 сбой создания из-за существующего файла, не являющегося каталогом, не считается ошибкой считается ошибкой

См. также

create_symlinkcreate_directory_symlink
(C++17)(C++17)
создаёт символическую ссылку
(функция)
copy
(C++17)
копирует файлы или каталоги
(функция)
perms
(C++17)
определяет права доступа к файловой системе
(перечисление)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/filesystem/create_directory

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API