c++:获取临时文件,跨平台



我正在寻找一种获得指定临时文件的跨平台方式。例如,在linux中,它将在/tmp目录中,而在Windows中,它将在类似于C:UsersUsernameAppDataLocalTemp的目录中。

是否存在跨平台(Boost?)的解决方案?

编辑:

我需要这个文件一直存在到程序终止。tmpfile()不能保证这一点。引用自ccpreference:

创建的临时文件在流关闭(fclose)或程序正常终止时自动删除

Boost Filesystem库,从该库的版本3开始,可以用来创建临时文件名。它还提供了一个干脆利落的解决方案。实际上,下面的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提供与字符串相同的信息。

如果你使用Qt: QTemporaryFile类是完美的。

标准C库包含一个名为tmpfile的函数,它可能会满足您的需要:http://www.cplusplus.com/reference/clibrary/cstdio/tmpfile/

您也可以在c++程序中使用它。

编辑:
如果您只需要文件名,您可以使用tmpnam,它不会在调用fclose时删除文件。它返回完整的文件路径,包括临时目录。

C方式:

const char *name = tmpnam(NULL);  // Get temp name
FILE *fp = fopen(name, "w");  // Create the file
// ...
fclose(fp);
remove(name);

从c++ 17开始,您可以使用std::filesystem::temp_directory_path()

您可以使用C标准库函数tmpfile

编辑:特别是因为你似乎喜欢Boost的想法,Robbie Morrison的答案可能更适合你。

我最初的答案仍然在下面,但是任何读到这篇文章的人:请注意tmpnam是不安全的。此外,一些平台(如Windows)可能已经损坏,有缺陷,脑残,甚至缺少实现。


如果你不喜欢tmpfile,那么tmpnam呢?

从链接:

以这种方式创建的文件,不像使用tmpfile创建的则不是关闭后自动删除;你应该调用remove来删除这个文件吗一旦关闭。

特别是如果您需要另一个程序知道文件的名称,这似乎更合适,因为tmpfile根本没有给您一个名称。

我认为它不是那么安全,虽然,如果这是一个问题。以下是其中一些问题的链接。


题外:即使您想使用tmpfile,您也应该考虑更安全的tmpfile_s (MS文档甚至称tmpfile为"已弃用",尽管我怀疑它会在十年内从c++标准中删除)。无论如何,它们都不保留您需要的已命名文件。

程序之间有比随机临时文件更好的通信方式。你能用管道代替吗?使用本地主机套接字怎么样?

如果你坚持使用文件,让你的程序使用一个名字,可能是基于启动时间。

最新更新