我正在寻找一种跨平台的方式来指定临时文件。例如,在 Linux 中,该目录位于
/tmp
目录中,而在 Windows 中,该目录位于类似于 C:\Users\Username\AppData\Local\Temp
的目录中。
是否存在跨平台(Boost?)解决方案?
编辑:
我需要这个文件存在直到程序终止。
tmpfile()
不保证这一点。引用自ccpreference:
创建的临时文件会在流关闭(fclose)时或程序正常终止时自动删除。
Boost Filesystem 库可用于创建 临时文件名。它还提供了一个清晰的解决方案。事实上,以下 C++ 代码应该是平台无关的:
// Boost.Filesystem VERSION 3 required
#include <string>
#include <boost/filesystem.hpp>
boost::filesystem::path temp = boost::filesystem::unique_path();
const std::string tempstr = temp.native(); // optional
文件系统路径对象 temp
可用于打开文件或创建子目录,而字符串对象
tempstr
提供与字符串相同的信息。
QTemporaryFile 类是完美的。
tmpfile
的函数,它可能可以满足您的需要:http://www.cplusplus.com/reference/clibrary/cstdio/tmpfile/ 您也可以在 C++ 程序中使用它。
编辑:
如果只需要文件名,可以使用 tmpnam
const char *name = tmpnam(NULL); // Get temp name
FILE *fp = fopen(name, "w"); // Create the file
// ...
fclose(fp);
remove(name);
std::filesystem::temp_directory_path()。
tmpfile
。
编辑:特别是因为您似乎喜欢Boost的想法,Robbie Morrison的答案可能更适合您。
我原来的答案仍然在下面,但任何读到这篇文章的人:请注意 tmpnam 不安全。此外,某些平台(例如 Windows)可能已损坏、有缺陷、脑死亡,甚至缺少实现。
tmpnam 怎么样?
来自链接:
以这种方式创建的文件,与 那些用 tmpfile 创建的不是 关闭时自动删除;你 应该调用remove来删除这个文件 一旦关闭。特别是如果您需要另一个程序来知道文件的名称,这似乎更合适,因为 tmpfile 根本不给您名称。
我认为它并不那么安全,如果这是一个问题的话。 这是描述其中一些问题的旁白:即使你想使用 tmpfile,你也应该考虑更安全的
(MS docs 甚至称 tmpfile “已弃用”,尽管我怀疑它会在任何十年从 C++ 标准中删除)很快)。无论如何,它们都不会保留您需要的命名文件。
如果您坚持使用文件,只需让您的程序使用一个名称,可能基于启动时间。