在node.js中,如何生成唯一的临时文件名la mkstemp(3)
?我想使用fs.rename
原子地写一个文件。
答案 0 :(得分:41)
另一个受欢迎的软件包是tmp。
答案 1 :(得分:21)
也许你已经在此期间找到了node-temp。
答案 2 :(得分:15)
不使用任何其他插件:
var crypto = require('crypto');
var fs = require('fs');
var filename = 'foo'+crypto.randomBytes(4).readUInt32LE(0)+'bar';
fs.writeFileSync(filename, 'baz');
编辑:阅读评论。
答案 3 :(得分:2)
类似于kinematic's answer,但具有2字节的额外熵和字母而不是数字:
import Crypto from 'crypto';
import {tmpdir} from 'os';
import Path from 'path';
function tmpFile(ext) {
return Path.join(tmpdir(),`archive.${Crypto.randomBytes(6).readUIntLE(0,6).toString(36)}.${ext}`);
}
用法:
const file = tmpFile('tar.gz'); // "/tmp/archive.1scpz5ew5d.tar.gz"
我正在创建档案,因此我选择“存档”作为基本名称,但是您可以根据需要进行更改。
答案 4 :(得分:1)
尝试此功能,安全且无漏洞。 NODE 8.x LTS
function tempFile (name = 'temp_file', data = '', encoding = 'utf8') {
const fs = require('fs');
const os = require('os');
const path = require('path');
return new Promise((resolve, reject) => {
const tempPath = path.join(os.tmpdir(), 'foobar-');
fs.mkdtemp(tempPath, (err, folder) => {
if (err)
return reject(err)
const file_name = path.join(folder, name);
fs.writeFile(file_name, data, encoding, error_file => {
if (error_file)
return reject(error_file);
resolve(file_name)
})
})
})
}
它解析临时文件的PATH,拒绝mkdtemp或writeFile错误
// C:\Users\MYPC\AppData\Local\Temp\foobar-3HmKod\temp_file
// /temp/Temp/foobar-3HmKod/temp_file
tempFile().then(path => console.log(path)).catch(e => console.log("error", e)) //or
// C:\Users\MYPC\AppData\Local\Temp\foobar-9KHuxg\hola.txt
// /temp/Temp/foobar-9KHuxg/hola.txt
tempFile('hola.txt', 'hello there').then(path => console.log(path)).catch(e => console.log("e", e))
答案 5 :(得分:1)
在 node 和 python 中创建临时文件会受到涉及权限更改和跨平台问题的竞争条件的影响,尤其是在测试 ACL 具有挑战性的 Windows 上。
结果是它实际上可以挂起您的机器,要求提供许多现代语言的临时文件。 (如果节点无权访问临时目录,根据 ACL,它可以获得 EEXIST,即使文件不存在 - 其结果可能是无限循环。
最简单的解决方案是使用足够的熵,使得碰撞的可能性可以忽略不计(在密码学意义上)。
这还具有使临时文件创建跨所有平台安全的副作用,而无需对源代码进行大量审查。只要您的随机数是安全的,就无法预测将用于篡夺权限或访问的文件。
它有助于需要传递文件名而不是文件句柄的程序。
const crypto = require('crypto');
const os = require('os');
const path = require('path');
function tmpFile(prefix, suffix, tmpdir) {
prefix = (typeof prefix !== 'undefined') ? prefix : 'tmp.';
suffix = (typeof suffix !== 'undefined') ? suffix : '';
tmpdir = tmpdir ? tmpdir : os.tmpdir();
return path.join(tmpdir, prefix + crypto.randomBytes(16).toString('hex') + suffix);
}
唯一的缺点是这不适用于 FAT 格式的分区,这在 U 盘上仍然很常见。