GNU/Linux >> Linux の 問題 >  >> Linux

C++で一時ディレクトリを作成するには?

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 を確認してください


Linux
  1. Tmuxの現在のディレクトリに新しいウィンドウを作成するにはどうすればよいですか?

  2. シェルスクリプトで一時ファイルを作成するにはどうすればよいですか?

  3. ファイルを作成してファイルシステムとしてマウントする方法は?

  1. 仮想ディレクトリを作成する方法

  2. Linux で Snapper コマンドを使用してファイルシステムのスナップショットを作成する方法

  3. CentOS/RHEL で tmpfs ファイルシステムを作成する方法

  1. Linuxパーティションまたは論理ボリュームにファイルシステムを作成する方法

  2. C++/Linux でディレクトリ ツリーを作成するにはどうすればよいですか?

  3. Unix/Linux でカスタム コマンドを作成するには?