Namespaces
Variants

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

From cppreference.net
Definido en el encabezado <filesystem>
bool create_directory ( const std:: filesystem :: path & p ) ;
(1) (desde C++17)
bool create_directory ( const std:: filesystem :: path & p, std:: error_code & ec ) noexcept ;
(2) (desde C++17)
bool create_directory ( const std:: filesystem :: path & p,
const std:: filesystem :: path & existing_p ) ;
(3) (desde C++17)
bool create_directory ( const std:: filesystem :: path & p,

const std:: filesystem :: path & existing_p,

std:: error_code & ec ) noexcept ;
(4) (desde C++17)
bool create_directories ( const std:: filesystem :: path & p ) ;
(5) (desde C++17)
bool create_directories ( const std:: filesystem :: path & p, std:: error_code & ec ) ;
(6) (desde C++17)
1,2) Crea el directorio p como si fuera mediante POSIX mkdir() con un segundo argumento de static_cast < int > ( std:: filesystem :: perms :: all ) (el directorio padre debe existir previamente). Si la función falla porque p resuelve a un directorio existente, no se reporta ningún error. En caso contrario, ante un fallo se reporta un error.
3,4) Igual que (1,2) , excepto que los atributos del nuevo directorio se copian desde existing_p (que debe ser un directorio existente). Depende del sistema operativo qué atributos se copian: en sistemas POSIX, los atributos se copian como si fuera mediante
stat(existing_p.c_str(), &attributes_stat)
mkdir(p.c_str(), attributes_stat.st_mode)
En Windows OS, no se copian atributos de existing_p .
5,6) Ejecuta (1,2) para cada elemento de p que aún no exista. Si p ya existe, la función no hace nada (esta condición no se trata como un error).

Contenidos

Parámetros

p - la ruta al nuevo directorio a crear
existing_p - la ruta a un directorio del cual copiar los atributos
ec - parámetro de salida para reporte de errores en la sobrecarga no lanzadora

Valor de retorno

true si se creó un directorio nuevo para el directorio al que p hace referencia, false en caso contrario.

Excepciones

Cualquier sobrecarga no marcada como noexcept puede lanzar std::bad_alloc si la asignación de memoria falla.

1,5) Lanza std::filesystem::filesystem_error en errores de la API del sistema operativo subyacente, construido con p como primer argumento de ruta y el código de error del sistema operativo como argumento de código de error.
2,6) Establece un parámetro std:: error_code & al código de error de la API del sistema operativo si una llamada a la API del SO falla, y ejecuta ec. clear ( ) si no ocurren errores.
3) Lanza std::filesystem::filesystem_error en errores de la API del sistema operativo subyacente, construido con p como primer argumento de ruta, existing_p como segundo argumento de ruta, y el código de error del sistema operativo como argumento de código de error.
4) Establece un parámetro std:: error_code & al código de error de la API del sistema operativo si una llamada a la API del SO falla, y ejecuta ec. clear ( ) si no ocurren errores.

Notas

La sobrecarga que preserva atributos (3,4) es invocada implícitamente por copy() cuando se copian directorios recursivamente. Su equivalente en boost.filesystem es copy_directory (con el orden de argumentos invertido).

Ejemplo

#include <cassert>
#include <cstdlib>
#include <filesystem>
int main()
{
    std::filesystem::current_path(std::filesystem::temp_directory_path());
    // Uso básico
    std::filesystem::create_directories("sandbox/1/2/a");
    std::filesystem::create_directory("sandbox/1/2/b");
    // El directorio ya existe (retorna false, sin error)
    assert(!std::filesystem::create_directory("sandbox/1/2/b"));
    // Uso de copia de permisos
    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");
}

Salida posible:

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

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares publicados anteriormente de C++.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 2935 C++17 error si el objetivo ya existe pero no es un directorio no es error
LWG 3014 C++17 error_code sobrecarga de create_directories marcada noexcept pero puede asignar memoria noexcept eliminado
P1164R1 C++17 fallo de creación causado por un archivo existente no-directorio no es un error convertido en error

Véase también

crea un enlace simbólico
(función)
(C++17)
copia archivos o directorios
(función)
(C++17)
identifica permisos del sistema de archivos
(enumeración)