如何获取D2中File.tmpfile创建的临时文件的名称?

时间:2012-02-21 23:45:59

标签: file-io d

我需要生成一个临时文件,用一些数据填充它并将其提供给外部程序。根据可用的D here的描述,我正在使用File.tmpfile()方法:

auto f = File.tmpfile();
writeln(f.name());

,它不提供获取生成的文件名的方法。据记载,name可能为空。在Python中,我会这样做:

(o_fd, o_filename) = tempfile.mkstemp('.my.own.suffix')

在D2中有一种简单,安全且跨平台的方式吗?

1 个答案:

答案 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()。默认为写入权限。

作为注释,“随机生成的文件名”不是真正随机的,因为种子是在编译时设置的。