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

时间:2011-04-07 19:15:38

标签: c++ temporary-files

我正在寻找一种跨平台的方式来获取指定的临时文件。例如,在linux中的/tmp目录和Windows中的一些名为Internet Explorer的临时目录。

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

修改

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

  

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

7 个答案:

答案 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_sMS docs甚至可以调用tmpfile“弃用”,尽管我怀疑它会被删除任何十年的C ++标准)。无论如何,这些都不会保留您需要的命名文件。

答案 5 :(得分:1)

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

答案 6 :(得分:0)

与随机临时文件相比,程序之间的通信方式要好得多。您可以使用管道进行通信吗?那么使用localhost套接字呢?

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