2011-08-14 34 views
30

En node.js, ¿cómo puedo generar un nombre de archivo temporal único, a la mkstemp(3)? Quiero escribir atómicamente un archivo usando fs.rename.nodejs - Nombre de archivo temporal

+10

Esto no es una recomendación de herramienta. Esto es cuestión de si existe una API. Quiero decir qué demonios, 90% de las preguntas sobre SO son sobre si existe alguna API para hacer algo. Ciérrelos todos o ninguno. –

+0

Esta es una pregunta de recomendación de herramienta. Y tenemos un sitio para eso: http://softwarerecs.stackexchange.com/questions/34842/create-a-temporary-directory-in-node-js :-) –

Respuesta

18

Quizás ya haya encontrado node-temp mientras tanto.

+0

@ k0pernikus puede encontrar ejemplos actualizados en el sitio de la biblioteca – Marc

11

Sin necesidad de utilizar ningún tipo de plugins adicionales:

var crypto = require('crypto'); 
var fs = require('fs'); 

var filename = 'foo'+crypto.randomBytes(4).readUInt32LE(0)+'bar'; 
fs.writeFileSync(filename, 'baz'); 

EDIT: leer los comentarios.

+31

¡Cuidado, este es un antipatrón clásico que es muy peligroso! Este tipo de código ha resultado en muchas vulnerabilidades a lo largo de los años, y es la razón exacta por la que se creó mkstemp para reemplazar mktemp. Para garantizar la seguridad, el archivo debe abrirse con los indicadores O_CREAT y O_EXCL para evitar que otro usuario prediga el nombre del archivo y cree un enlace simbólico antes de poder escribir en él. Supongo que si estás absolutamente seguro de que otro usuario no podría predecir el nombre de archivo en un millón de años, no es necesario, pero ¿por qué arriesgarse? http://en.wikipedia.org/wiki/Symlink_race – Geoff

+1

No creo que haya suficiente entropía en ese nombre de archivo, saca 'foo1492796329bar' un SHA1 con una sal al azar sería mejor –

+3

Josue, estoy de acuerdo con que 32 bits de la entropía es muy pequeña Sin embargo, 64 bits deberían ser suficientes para archivos de corta duración. ¿Por qué sugieres un hash si ya tenemos un valor aleatorio? –

36

Otro paquete popular es tmp.

+3

Esta es la verdadera respuesta –

+15

¿por qué es esta la verdadera respuesta? – cambecc

+0

Por una vez, el paquete tmp es más popular actualmente. En segundo lugar, hay algunas ventajas menores documentadas en https://github.com/raszi/node-tmp/blob/master/README.md#about –

Cuestiones relacionadas