How to create a tmp dir in node without collisions
我需要在node.js中按需创建一个临时的"scratch"目录。要求如下:
- dirname应该是随机的(即EDOCX1[0]
- 目录将在
/tmp 中创建,该目录可能已经有其他随机命名的目录。 - 如果目录已经存在,我应该抛出而不是使用它并覆盖其他人的工作
- 这需要在并发环境中是安全的。我不能只检查目录是否存在,如果不存在,就创建它,因为在我检查之后,其他人可能创建了一个同名目录。
换句话说,我需要这个问题的答案,但目录,而不是文件。
这个答案说我想做的事情可以由
您可以尝试打包"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的替换,因此您不必关心
提示:如果要将目录保存在操作系统的默认临时目录中,那么可以使用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 } } |