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

Bon*_*Oak 14 javascript directory concurrency file node.js

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

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

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

这个答案说我想做的事情可以通过mkdir -p,但Node没有-p标志fs.mkdir

小智 12

你可以试试包"tmp".它有一个配置参数"template",后者又使用Linux的mkstemp函数,它可能解决了你的所有要求.

  • 我应该在我的存储库中安装另一个已经有 16657 个依赖项的包吗?...它要去哪里? (2认同)

Ben*_*uer 5

创建唯一目录的一种简单方法是在路径名中使用通用唯一标识符(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}`);
});
Run Code Online (Sandbox Code Playgroud)

您将得到如下输出:

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

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

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

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}`);
});
Run Code Online (Sandbox Code Playgroud)

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


Het*_*mei 5

当前的节点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
Run Code Online (Sandbox Code Playgroud)