Boost Filesystem Library のバージョン 3 は、関数 unique_path()
を提供します 一時ファイルまたはディレクトリの作成に適したパス名を生成します。
using namespace boost::filesystem;
path ph = temp_directory_path() / unique_path();
create_directories(ph);
C++17 std::filesystem::temp_directory_path
+ 乱数生成
信頼できる純粋な C++17 ソリューションを次に示します。Boost やその他の外部ライブラリはなく、mkdtemp
もありません。 これは POSIX です。
std::filesystem::temp_directory_path
内に以前は存在しなかったディレクトリを作成できるようになるまで、乱数をループします。 (/tmp
Ubuntu 18.04 で)
std::filesystem::remove_all
を使用して、作成したディレクトリを明示的に削除できます。
C++ 標準がこれを保証しているかどうかはわかりませんが、 std::filesystem::temp_directory_path
である可能性が非常に高いです mkdir
を呼び出します 、アトミックにディレクトリを作成しようとし、失敗した場合は EEXIST
で失敗します であるため、並列呼び出し元間で競合状態が発生する可能性はないと思います。
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 アップストリーム。
コンパイルして実行:
g++-8 -std=c++17 -Wall -Wextra -pedantic -o main.out main.cpp -lstdc++fs
./main.out
出力例:
_directory.out
temp_directory_path() = "/tmp"
create_temporary_directory() = "/tmp/106adc08ff89874c"
ファイルについては、C++ で一時テキスト ファイルを作成する方法を参照してください。 open
のため、ファイルが少し異なります Linux には O_TMPFILE
があります これは、閉じると自動的に消える匿名の inode を作成するため、それを使用することで専用の一時ファイル API をより効率的に使用できます。 mkdir
に類似したフラグはありません ただし、このソリューションが最適な場合があります。
Ubuntu 18.04 でテスト済み。
Boost の Filesystem ライブラリは、プラットフォームに依存しないディレクトリ機能を提供します。プログラムのサイズが少し大きくなりますが、Boost を使用する方が、自分で作成するよりも優れていることがよくあります (多くの場合、簡単です)。
http://www.boost.org/doc/libs/1_43_0/libs/filesystem/doc/index.htm
mkdtemp
を確認してください