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

orl*_*rlp 41 c++ temporary-files

我正在寻找一种跨平台的方式来获取指定的临时文件.例如,在linux中,它将位于/tmpdir中,而在Windows中则位于一些名为Internet Explorer的临时目录中.

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

编辑:

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

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

小智 80

提高文件系统库,该库的版本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
Run Code Online (Sandbox Code Playgroud)

文件系统路径对象temp可用于打开文件或创建子目录,而字符串对象tempstr提供与字符串相同的信息.有关详细信息,请访问http://www.boost.org.

  • unique_path只返回文件名.使用`boost :: filesystem :: temp_directory_path()/ boost :: filesystem :: unique_path()`获取完整的临时路径名. (22认同)
  • 对于那些想知道:`unique_path()`由于可能的竞争条件而不会成为`std :: filesystem`的一部分,请参阅https://wg21.cmeerw.net/lwg/msg7747. (5认同)
  • @MattClarkson这与`tmpnam()`有完全相同的问题. (3认同)
  • 这应该被接受 - "tmpnam"可以是攻击向量. (2认同)

Nas*_*zta 7

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


Kar*_*nek 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);
Run Code Online (Sandbox Code Playgroud)

  • 使用`tmpnam`也意味着引入竞争条件. (5认同)
  • 对于那些想知道 `tmpname` 引入竞争条件是什么意思的人,请参阅此 http://www.zachburlingame.com/2011/06/creating-temporary-files-on-win32-in-c-part-1/ (2认同)