GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo crear un directorio temporal en C++?

La versión 3 de Boost Filesystem Library proporciona la función unique_path() para generar un nombre de ruta adecuado para crear un archivo o directorio temporal.

using namespace boost::filesystem;

path ph = temp_directory_path() / unique_path();
create_directories(ph);

C++17 std::filesystem::temp_directory_path + generación de números aleatorios

Aquí hay una solución pura de C++17 que podría ser confiable:sin Boost u otras bibliotecas externas y sin mkdtemp que es POSIX.

Simplemente repasamos números aleatorios hasta que podamos crear un directorio que no existía antes dentro de std::filesystem::temp_directory_path (/tmp en Ubuntu 18.04).

Luego podemos eliminar explícitamente el directorio creado con std::filesystem::remove_all después de que hayamos terminado con él.

No estoy seguro de que el estándar C++ garantice esto, pero es muy probable que std::filesystem::temp_directory_path llamadas mkdir , que atómicamente intenta crear el directorio y, si no puede, falla con EEXIST , por lo que no creo que pueda haber condiciones de carrera entre llamadas paralelas.

principal.cpp

#include <exception>
#include <fstream>
#include <iostream>
#include <random>
#include <sstream>

#include <filesystem>

std::filesystem::path create_temporary_directory(
      unsigned long long max_tries = 1000) {
    auto tmp_dir = std::filesystem::temp_directory_path();
    unsigned long long i = 0;
    std::random_device dev;
    std::mt19937 prng(dev());
    std::uniform_int_distribution<uint64_t> rand(0);
    std::filesystem::path path;
    while (true) {
        std::stringstream ss;
        ss << std::hex << rand(prng);
        path = tmp_dir / ss.str();
        // true if the directory was created.
        if (std::filesystem::create_directory(path)) {
            break;
        }
        if (i == max_tries) {
            throw std::runtime_error("could not find non-existing directory");
        }
        i++;
    }
    return path;
}

int main() {
    auto tmpdir = create_temporary_directory();
    std::cout << "create_temporary_directory() = "
              << tmpdir
              << std::endl;

    // Use our temporary directory: create a file
    // in it and write to it.
    std::ofstream ofs(tmpdir / "myfile");
    ofs << "asdf\nqwer\n";
    ofs.close();

    // Remove the directory and its contents.
    std::filesystem::remove_all(tmpdir);
}

GitHub ascendente.

Compilar y ejecutar:

g++-8 -std=c++17 -Wall -Wextra -pedantic -o main.out main.cpp -lstdc++fs
./main.out

Salida de muestra:

_directory.out
temp_directory_path() = "/tmp"
create_temporary_directory() = "/tmp/106adc08ff89874c"

Para archivos, consulte:¿Cómo crear un archivo de texto temporal en C++? Los archivos son un poco diferentes porque open en Linux tiene el O_TMPFILE , que crea un inodo anónimo que desaparece automáticamente al cerrar, por lo que las API de archivos temporales dedicadas pueden ser más eficientes al usar eso. No hay bandera análoga para mkdir sin embargo, esta solución podría ser óptima.

Probado en Ubuntu 18.04.


La biblioteca del sistema de archivos de Boost proporciona funciones de directorio independientes de la plataforma. Aumentará un poco el tamaño de su programa, pero usar Boost suele ser mejor (y más fácil) que ejecutar el suyo propio.

http://www.boost.org/doc/libs/1_43_0/libs/filesystem/doc/index.htm


Compruebe el mkdtemp función aquí.


Linux
  1. ¿Cómo crear una nueva ventana en el directorio actual en Tmux?

  2. ¿Cómo crear un archivo temporal en Shell Script?

  3. ¿Cómo crear un archivo y montarlo como un sistema de archivos?

  4. Cómo crear un directorio virtual

  5. Cómo crear un sistema de archivos ZFS con compresión de archivos en Linux

Cómo usar el comando mkdir para hacer o crear un directorio de Linux

Cómo crear directorios en Linux (comando mkdir)

Cómo crear un directorio en Linux usando el comando mkdir

Cómo crear un sistema de archivos XFS

Cómo crear/agregar usuarios en Linux

Cómo crear una estructura de directorios en bazel