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 <cstdlib>
#include <filesystem>
#include <fstream>
#include <iostream>
namespace fs = std::filesystem;
 
int main()
{
    fs::current_path(fs::temp_directory_path());
    fs::create_directories("sandbox/1/2/a");
    fs::create_directory("sandbox/1/2/b");
    fs::permissions("sandbox/1/2/b", fs::perms::others_all, fs::perm_options::remove);
    fs::create_directory("sandbox/1/2/c", "sandbox/1/2/b");
    std::system("ls -l sandbox/1/2");
    std::system("tree sandbox");
    fs::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/w/cpp/filesystem/create_directory

Spec-Zone.ru

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