kin*_*tic 15
不使用任何其他插件:
var crypto = require('crypto');
var fs = require('fs');
var filename = 'foo'+crypto.randomBytes(4).readUInt32LE(0)+'bar';
fs.writeFileSync(filename, 'baz');
Run Code Online (Sandbox Code Playgroud)
编辑:阅读评论.
Eri*_*sty 12
在 Node 和 Python 中创建临时文件会受到涉及权限更改和跨平台问题的竞争条件的影响,尤其是在 Windows 上,测试 ACL 具有挑战性。
结果是,它实际上可以挂起您的计算机,要求提供许多现代语言的临时文件。(如果节点无权访问临时目录,根据 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);
}
Run Code Online (Sandbox Code Playgroud)
唯一的缺点是这不适用于 FAT 格式的分区,而 FAT 格式的分区在 U 盘上仍然很常见。
试试这个功能,安全无漏洞。节点 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)
})
})
})
}
Run Code Online (Sandbox Code Playgroud)
它解析临时文件的 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))
Run Code Online (Sandbox Code Playgroud)
与kinematic 的答案类似,但有 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}`);
}
Run Code Online (Sandbox Code Playgroud)
用法:
const file = tmpFile('tar.gz'); // "/tmp/archive.1scpz5ew5d.tar.gz"
Run Code Online (Sandbox Code Playgroud)
我正在创建档案,所以我选择“archive”作为基本名称,但您可以根据需要更改它。
| 归档时间: |
|
| 查看次数: |
45456 次 |
| 最近记录: |