GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana cara membuat direktori sementara di C++?

Perpustakaan Boost Filesystem versi 3 menyediakan fungsi unique_path() untuk membuat nama jalur yang cocok untuk membuat file atau direktori sementara.

using namespace boost::filesystem;

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

C++17 std::filesystem::temp_directory_path + pembuatan nomor acak

Berikut adalah solusi C++17 murni yang mungkin dapat diandalkan:tanpa Boost atau pustaka eksternal lainnya dan tanpa mkdtemp yaitu POSIX.

Kami hanya mengulangi nomor acak sampai kami dapat membuat direktori yang sebelumnya tidak ada di dalam std::filesystem::temp_directory_path (/tmp di Ubuntu 18.04).

Kami kemudian dapat secara eksplisit menghapus direktori yang dibuat dengan std::filesystem::remove_all setelah kita selesai dengan itu.

Saya tidak yakin bahwa standar C++ menjamin hal ini, tetapi sangat mungkin bahwa std::filesystem::temp_directory_path memanggil mkdir , yang secara atom mencoba membuat direktori dan jika tidak bisa gagal dengan EEXIST , jadi menurut saya tidak akan ada kondisi balapan di seluruh penelepon paralel.

main.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 upstream.

Kompilasi dan jalankan:

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

Keluaran sampel:

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

Untuk file, lihat:Bagaimana cara membuat file teks sementara di C++? File sedikit berbeda karena open di Linux memiliki O_TMPFILE , yang membuat inode anonim yang secara otomatis menghilang saat ditutup, jadi API file sementara khusus bisa lebih efisien dengan menggunakannya. Tidak ada bendera analog untuk mkdir namun, jadi solusi ini mungkin optimal.

Diuji di Ubuntu 18.04.


Perpustakaan Filesystem Boost menyediakan fungsi direktori platform-independen. Ini akan sedikit meningkatkan ukuran program Anda, tetapi menggunakan Boost sering kali lebih baik (dan seringkali lebih mudah) daripada meluncurkan program Anda sendiri.

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


Periksa mkdtemp berfungsi di sini.


Linux
  1. Cara Membuat Sistem File ZFS dengan Kompresi File di Linux

  2. Cara Membuat Direktori Baru di Linux

  3. Bagaimana saya bisa membuat pohon direktori di C++/Linux?

  1. Cara membuat sistem file pada partisi Linux atau volume logis

  2. Cara membuat tautan ke direktori

  3. Bagaimana cara membuat perintah khusus di Unix/Linux?

  1. Cara Membuat Direktori Bersama untuk Semua Pengguna di Linux

  2. Bagaimana Cara Membuat Jendela Baru Di Direktori Saat Ini Di Tmux?

  3. Bagaimana Membuat File Sementara Di Shell Script?