c++:获取临时文件,跨平台
C++: Getting a temporary file, cross-platform
我正在寻找一种获得指定临时文件的跨平台方式。例如,在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
我最初的答案仍然在下面,但是任何读到这篇文章的人:请注意tmpnam是不安全的。此外,一些平台(如Windows)可能已经损坏,有缺陷,脑残,甚至缺少实现。
如果你不喜欢tmpfile,那么tmpnam呢?
从链接:
以这种方式创建的文件,不像使用tmpfile创建的则不是关闭后自动删除;你应该调用remove来删除这个文件吗一旦关闭。
特别是如果您需要另一个程序知道文件的名称,这似乎更合适,因为tmpfile根本没有给您一个名称。
我认为它不是那么安全,虽然,如果这是一个问题。以下是其中一些问题的链接。
题外:即使您想使用tmpfile,您也应该考虑更安全的tmpfile_s (MS文档甚至称tmpfile为"已弃用",尽管我怀疑它会在十年内从c++标准中删除)。无论如何,它们都不保留您需要的已命名文件。
程序之间有比随机临时文件更好的通信方式。你能用管道代替吗?使用本地主机套接字怎么样?
如果你坚持使用文件,让你的程序使用一个名字,可能是基于启动时间。
- 用于 Windows 写入临时文件的 mkstemp() 实现
- Visual Studio跨平台生成文件项目,找不到命令
- 巴泽尔 无法创建临时文件
- 为什么将可执行文件重命名为临时文件的此代码段不能按预期工作?
- 无法使用 ofstream 写入 Windows 7 中的临时文件夹
- 如何写入临时文件夹
- C++跨平台轻量级文件、线程和处理库
- Windows本身是否有虚拟或临时文件系统
- C/C++:在不使用临时文件的情况下压缩(gz)数据
- 写入临时文件
- 删除临时文件夹的内容
- C++11是否允许引用一个匿名的临时文件
- 消除visual studio解决方案文件夹中的临时文件
- 无法使用tmpfnam在C++中的Windows上创建临时文件
- Windows 上的临时文件和文件夹
- 无法在所需目录中创建临时文件
- 创建临时文件:无法写入
- C++临时文件作为 bash 脚本执行
- Doxygen 错误:无法打开临时文件 /path/to/file/doxygen_objdb_3332.tmp
- c++:获取临时文件,跨平台