如何在C ++中创建临时目录?

时间:2010-07-31 22:05:56

标签: c++ linux winapi temporary-directory

我正在用C ++编写一个函数来创建一个临时目录。这种功能应该尽可能地便携,例如它应该在linux,mac和win32环境下工作。我如何实现这一目标?

6 个答案:

答案 0 :(得分:16)

Boost Filesystem Library的第3版提供了函数unique_path(),用于生成适合创建临时文件或目录的路径名。

using namespace boost::filesystem;

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

答案 1 :(得分:4)

检查mkdtemp功能here

答案 2 :(得分:2)

C ++ 17 std::filesystem::temp_directory_path +随机数生成

这里是纯C ++ 17,可能是可靠的:没有Boost或其他外部库,也没有mkdtemp,即POSIX

我们只是遍历随机数,直到能够创建在std::filesystem::temp_directory_path(在Ubuntu 18.04中为/tmp)内部之前不存在的目录。

完成后,我们可以使用std::filesystem::remove_all显式删除创建的目录。

我不确定C ++标准是否可以保证这一点,但是很有可能std::filesystem::temp_directory_path会调用mkdir,这会原子地尝试创建目录,并且如果以{{1 }},因此我认为并行调用者之间不会存在竞争条件。

main.cpp

EEXIST

GitHub upstream

编译并运行:

#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);
}

示例输出:

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

有关文件,请参见:How to create a temporary text file in C++?文件有点不同,因为Linux中的_directory.out temp_directory_path() = "/tmp" create_temporary_directory() = "/tmp/106adc08ff89874c" 具有creates an anonymous inode that automatically disappears on closeopen,因此专用的临时文件API可以更高效通过使用它。 O_TMPFILE没有类似的标志,因此该解决方案可能是最佳的。

在Ubuntu 18.04中进行了测试。

答案 3 :(得分:1)

Boost的Filesystem库提供与平台无关的目录功能。它会稍微增加你的程序大小,但是使用Boost通常比滚动你自己更好(并且通常更容易)。

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

答案 4 :(得分:0)

mkdtemp(char *template)

http://www.cl.cam.ac.uk/cgi-bin/manpage?3+mkdtemp

创建一个临时目录。

答案 5 :(得分:0)

没有标准功能可以执行此操作,因此您需要为您定位的每个平台编译不同的实现。

例如,在Windows上,您应该使用temp目录,该目录可以通过调用GetTempPath()获得。