我正在寻找一种跨平台的方式来获取指定的临时文件。例如,在linux中的/tmp
目录和Windows中的一些名为Internet Explorer的临时目录。
是否存在跨平台(Boost?)解决方案?
修改:
我需要这个文件存在,直到程序终止。 tmpfile()
不保证这一点。引用ccpreference:
当流关闭(fclose)或程序正常终止时,创建的临时文件会自动删除。
答案 0 :(得分:76)
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
提供与字符串相同的信息。有关详细信息,请参阅http://www.boost.org。
答案 1 :(得分:7)
如果您使用Qt:QTemporaryFile类是完美的。
答案 2 :(得分:5)
标准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);
答案 3 :(得分:4)
您可以使用C标准库函数tmpfile
。
答案 4 :(得分:2)
编辑:因为您似乎喜欢Boost的想法,Robbie Morrison's answer可能对您更好。
我的原始答案仍然如下,但是有人读到这个:请注意tmpnam是不安全的。此外,某些平台(如Windows)可能已经破坏,错误,脑死亡,甚至缺少实现。
如果你不喜欢tmpfile,tmpnam怎么样?
从链接:
以这种方式创建的文件,不像 那些用tmpfile创建的不是 关闭时自动删除;您 应该调用remove来删除这个文件 一旦关闭。
特别是如果你需要另一个程序来知道文件的名称,这似乎更合适,因为tmpfile根本不会给你一个名字。
我认为这不是那么安全,如果这是一个问题。 这是link describing some of those issues。
除此之外:即使您想使用tmpfile,您也应该考虑更安全的tmpfile_s(MS docs甚至可以调用tmpfile“弃用”,尽管我怀疑它会被删除任何十年的C ++标准)。无论如何,这些都不会保留您需要的命名文件。
答案 5 :(得分:1)
从C ++ 17开始,您可以使用std::filesystem::temp_directory_path()。
答案 6 :(得分:0)
与随机临时文件相比,程序之间的通信方式要好得多。您可以使用管道进行通信吗?那么使用localhost套接字呢?
如果你坚持使用文件,只需让你的程序使用一个名字,可能是根据启动时间。