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.