【问题标题】:POSIX ways for generation of a temporary file with a nice file namePOSIX 方法生成具有好文件名的临时文件
【发布时间】:2016-07-14 16:18:32
【问题描述】:

我想生成一个具有“好”名称的临时文件,例如

my-app-Mar27-120357-Qf3K0a.html

同时遵循security 的最佳做法。

POSIX 为我提供了 mkstemp(3),它采用文件名模板(通常类似于 /tmp/my-app-XXXXXX),但它有两个问题:

  1. 我需要自己选择输出目录。 When I see glibc tempnam(3) (which is deprecated for a security reason) considers many factors,我想让库函数选择它。
  2. 文件名中没有扩展名

第二个项目可以通过mkstemps(3) 来处理,它需要多个字符作为用户定义的扩展名。就我而言,我可以通过 my-app-Mar27-120357-XXXXXX.html5 但它有自己的问题:

  1. 我还是要选择输出目录
  2. 它不是完全便携的。 NetBSD 似乎缺少它。

所以我正在考虑使用已弃用的tempnam(3) 生成带有输出目录路径的文件名,用X 覆盖文件名部分并将其提供给mkstemp(3),然后将文件重命名为我的首选格式.所以问题出在最后一步,重命名而不覆盖;在 POSIX 中可以吗?

或者有没有更好的选择?

【问题讨论】:

  • Alex 的回答也是我推荐的,但是如果你真的想要一个名字,你可以使用一个标准的 C 函数 tmpnam
  • @JoachimPileborg tmpnam(3) 不如我在帖子中提到的tempnam(3) 灵活。
  • NetBSD 7.0 和更新的有mkstemps。但是它目前不存在于 Minix3 libc 中。
  • @kdhp 我显然检查了“DEFAULT (NetBSD-6.1.5)”。也许它默认是一个保守的选择。

标签: c file posix rename temporary-files


【解决方案1】:

另一种方法是简单地调整模板并添加您的路径。我们在 BEDOPS 工具包中描述了这样一个功能,sort-bed 应用程序使用它来允许最终用户指定临时中间文件的存储位置:https://github.com/bedops/bedops/blob/6da835468565dfc30a3fcb65807e91fcf133ea2b/applications/bed/sort-bed/src/SortDetails.cpp#L115

FILE *
createTmpFile(char const* path, char** fileName)
{
    FILE* fp;
    int fd;
    char* tmpl;

    if (path == NULL)
        {
            fileName = NULL;
            return tmpfile();
        }

    tmpl = static_cast<char*>( malloc(1 + strlen(path) + L_tmpnam) );
    strcpy(tmpl, path);
    strcpy(tmpl+strlen(path), "/sb.XXXXXX");
    fd = mkstemp(tmpl);
    if(fd == -1)
        {
            fprintf(stderr, "unable to create temp file!\n");
            return NULL;
        }
    fp = fdopen(fd, "wb+");
    *fileName = static_cast<char*>( malloc(strlen(tmpl) + 1) );
    strcpy(*fileName, tmpl);
    free(tmpl);
    return fp;
} 

这使用L_tmpnam 宏(stdio 库的一部分)来设置变量tmpl(最终是文件名)可以存储的字符数。

这可以在 Linux 和 OS X (BSD) 主机下编译和工作,并且还使用 POSIX 例程。

它比我的其他解决方案更复杂,但它可能更适合您的用例。

【讨论】:

  • 感谢分享一个实际的例子。你正在做一个有趣的项目,顺便说一句
【解决方案2】:

mkstemp 以它想要的符合 POSIX 的方式制作它想要制作的文件。使用symlink 建立一个符号链接,从您选择的源文件和路径到与使用mkstemp 产生的任何内容相匹配的目标。完成后删除符号链接。

【讨论】:

  • 嗯,我不能说我喜欢这个解决方案...“完成后删除符号链接。”想象一下,我正在处理一个故障转储,我的程序会提示用户通过电子邮件或网络上传将其发送到我们的服务器。但是,是的,这可能是最接近我意图的事情。
  • 如果您抛出一个导致致命错误的异常,您可以(应该)在该异常的处理程序中进行清理。
  • 我的意思是,在一些非常常见的用例中,临时文件可以合法地超过其生产者程序。
  • @nodakai 如果您担心崩溃后残留的杂散符号链接或临时文件,这通常是trap 会为您解决的问题。
猜你喜欢
  • 2011-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-18
相关资源
最近更新 更多