如何在没有冲突的节点中创建tmp目录

时间:2016-03-01 21:16:41

标签: javascript node.js file concurrency directory

我需要在node.js中按需创建一个临时的“临时”目录。要求是:

  • dirname应该是随机的(即/tmp/aDIge4G/
  • 将在/tmp内创建目录,该目录可能已经有其他随机命名的目录。
  • 如果目录已经存在,我应该抛弃而不是使用它并覆盖别人的工作
  • 这需要在并发环境中安全。我不能只检查目录是否存在,然后创建它,如果不存在,因为其他人可能在我检查了之后创建了一个名为的目录。

换句话说,我需要this问题的答案,但需要目录,而不是文件。

This回答说我想要做的事情可以由mkdir -p完成,但是Node没有-p的{​​{1}}标志

4 个答案:

答案 0 :(得分:9)

您可以尝试package "tmp"。它有一个配置参数“template”,它反过来使用Linux的mkstemp函数,它可能解决了你的所有要求。

答案 1 :(得分:1)

创建唯一目录的一种简单方法是在路径名中使用universally unique identifiers(UUID)。

以下是使用pure-uuid的示例:

const fs = require('fs-extra');
const path = require('path');
const UUID = require('pure-uuid');

const id = new UUID(4).format();
const directory = path.join('.', 'temp', id);

fs.mkdirs(directory).then(() => {
  console.log(`Created directory: ${directory}`);
});

您将获得如下输出:

  

创建目录:temp \ 165df8b8-18cd-4151-84ca-d763e2301e14

注意:在上面的代码中,我使用fs-extra作为fs的替代品,因此您无需关心{{1}因为mkdir -p将创建目录和任何必要的子目录。

提示:如果要将目录保存在操作系统的默认临时目录中,则可以使用os.tmpdir()。以下是一个如何工作的示例:

fs-extra
  

创建目录:C:\ Users \ bennyn \ AppData \ Local \ Temp \ 057a9978-4fd7-43d9-b5ea-db169f222dba

答案 2 :(得分:1)

当前节点api建议创建一个临时文件夹:https://nodejs.org/api/fs.html#fs_fs_mkdtemp_prefix_options_callback

给出:

fs.mkdtemp(path.join(os.tmpdir(), 'foo-'), (err, folder) => {
  if (err) throw err;
  console.log(folder);
  // Prints: /tmp/foo-itXde2
});
// folder /tmp/foo-itXde2 has been created on the file system

答案 3 :(得分:0)

使用fs.Stats检查它是否存在?

这样的东西?

fs.stat(path, function(err, stats) {

    if (!stats.isDirectory()) {
        // create directory here
    }
}