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), за исключением того, что атрибуты новой директории копируются из В операционных системах Windows атрибуты
existing_p (которая должна быть существующей директорией). Какие атрибуты копируются зависит от операционной системы: в системах POSIX атрибуты копируются так, как если бы использовалась stat(existing_p.c_str(), &attributes_stat) mkdir(p.c_str(), attributes_stat.st_mode)
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 | неудача создания, вызванная существующим файлом, который не является директорией, не является ошибкой | стала ошибкой |
См. также
|
(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/w/cpp/filesystem/create_directory