我需要生成一个临时文件,用一些数据填充它并将其提供给外部程序。根据可用的D here的描述,我正在使用File.tmpfile()
方法:
auto f = File.tmpfile();
writeln(f.name());
,它不提供获取生成的文件名的方法。据记载,name
可能为空。在Python中,我会这样做:
(o_fd, o_filename) = tempfile.mkstemp('.my.own.suffix')
在D2中有一种简单,安全且跨平台的方式吗?
答案 0 :(得分:0)
由于tmpfile()
的工作原理,如果您需要文件名,则无法使用它。但是,我已经创建了一个模块来处理临时文件。它使用条件编译来决定查找临时目录的方法。在Windows上,它使用%TMP%环境变量。在Posix上,它使用/ tmp /。
此代码根据WTFPL许可,因此您可以随意使用它。
module TemporaryFiles;
import std.conv,
std.random,
std.stdio;
version(Windows) {
import std.process;
}
private static Random rand;
/// Returns a file with the specified filename and permissions
public File getTempFile(string filename, string permissions) {
string path;
version(Windows) {
path = getenv("TMP") ~ '\\';
} else version(Posix) {
path = "/tmp/";
// path = "/var/tmp/"; // Uncomment to survive reboots
}
return File(path~filename, permissions);
}
/// Returns a file opened for writing, which the specified filename
public File getTempFile(string filename) {
return getTempFile(filename, "w");
}
/// Returns a file opened for writing, with a randomly generated filename
public File getTempFile() {
string filename = to!string(uniform(1L, 1000000000L, rand)) ~ ".tmp";
return getTempFile(filename, "w");
}
要使用它,只需使用您想要的任何参数调用getTempFile()。默认为写入权限。
作为注释,“随机生成的文件名”不是真正随机的,因为种子是在编译时设置的。