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

问题描述 投票:0回答:7

我正在寻找一种跨平台的方式来指定临时文件。例如,在 Linux 中,该目录位于

/tmp
目录中,而在 Windows 中,该目录位于类似于
C:\Users\Username\AppData\Local\Temp
的目录中。

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

编辑

我需要这个文件存在直到程序终止。

tmpfile()
不保证这一点。引用自ccpreference:

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

c++ temporary-files
7个回答
91
投票
该库版本 3 中的

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
 提供与字符串相同的信息。


8
投票
如果您使用 Qt:

QTemporaryFile 类是完美的。


7
投票
标准 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);
    

4
投票
从 C++17 开始,您可以使用

std::filesystem::temp_directory_path()


3
投票
您可以使用C标准库函数

tmpfile


2
投票

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

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


如果您不喜欢 tmpfile,那么

tmpnam 怎么样?

来自链接:

以这种方式创建的文件,与 那些用 tmpfile 创建的不是 关闭时自动删除;你 应该调用remove来删除这个文件 一旦关闭。

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

我认为它并不那么安全,如果这是一个问题的话。 这是描述其中一些问题的

链接。

旁白:即使你想使用 tmpfile,你也应该考虑更安全的
tmpfile_s

MS docs 甚至称 tmpfile “已弃用”,尽管我怀疑它会在任何十年从 C++ 标准中删除)很快)。无论如何,它们都不会保留您需要的命名文件。


-7
投票

如果您坚持使用文件,只需让您的程序使用一个名称,可能基于启动时间。

© www.soinside.com 2019 - 2024. All rights reserved.