如何在 C++ 中创建临时目录?
- 2024-11-11 08:27:00
- admin 原创
- 48
问题描述:
我正在用 C++ 编写一个函数来创建临时目录。此类函数应尽可能具有可移植性,例如,它应在 Linux、Mac 和 Win32 环境下运行。我该如何实现?
解决方案 1:
Boost Filesystem Library 版本 3 提供了unique_path()
生成适合创建临时文件或目录的路径名的功能。
using namespace boost::filesystem;
path ph = temp_directory_path() / unique_path();
create_directories(ph);
解决方案 2:
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
,因此我认为并行调用者之间不会出现竞争条件。
主程序
#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
qwer
";
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,该 inode 在关闭时会自动消失,因此使用它可以使专用的临时文件 API 更高效。但是没有类似的标志mkdir
,因此此解决方案可能是最佳的。
在 Ubuntu 18.04 中测试。
解决方案 3:
在此处检查该mkdtemp
功能。
解决方案 4:
Boost 的 Filesystem 库提供了独立于平台的目录函数。虽然这会稍微增加程序的大小,但使用 Boost 通常比自己编写更好(也更容易)。
http://www.boost.org/doc/libs/1_43_0/libs/filesystem/doc/index.htm
解决方案 5:
没有标准函数可以执行此操作,因此您需要针对每个目标平台编译不同的实现。
例如,在 Windows 上,您应该使用临时目录,可以通过调用 GetTempPath() 来获取该目录。
解决方案 6:
mkdtemp(char *template)
http://www.cl.cam.ac.uk/cgi-bin/manpage?3+mkdtemp
创建临时目录。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件