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

How to create a tmp dir in node without collisions

我需要在node.js中按需创建一个临时的"scratch"目录。要求如下:

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

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

这个答案说我想做的事情可以由mkdir -p完成,但是node没有fs.mkdir-p标志。


您可以尝试打包"tmp"。它有一个配置参数"template",该参数反过来使用Linux的mkstemp函数,该函数可能解决了您的所有需求。


当前节点api建议创建一个临时文件夹:https://nodejs.org/api/fs.html fs mkdtemp前缀选项回调

它给出:

1
2
3
4
5
6
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


创建唯一目录的一个简单方法是在路径名中使用通用唯一标识符(UUID)。

下面是使用纯UUID的示例:

1
2
3
4
5
6
7
8
9
10
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}`);
});

您将得到这样的输出:

Created directory: temp\165df8b8-18cd-4151-84ca-d763e2301e14

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

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

1
2
3
4
5
6
7
8
9
10
11
const fs = require('fs-extra');
const os = require('os');
const path = require('path');
const UUID = require('pure-uuid');

const id = new UUID(4).format();
const directory = path.join(os.tmpdir(), id);

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

Created directory: C:\Users\bennyn\AppData\Local\Temp\057a9978-4fd7-43d9-b5ea-db169f222dba


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

像这样?

1
2
3
4
5
6
fs.stat(path, function(err, stats) {

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