El proyecto en el que estoy trabajando (node.js) implica muchas operaciones con el sistema de archivos (copia / lectura / escritura, etc.). Me gustaría saber qué métodos son los más rápidos, y me gustaría recibir un consejo. Gracias.
javascript
node.js
bonbonez
fuente
fuente
Respuestas:
Esta es una buena manera de copiar un archivo en una línea de código utilizando secuencias:
En el nodo v8.5.0, se agregó copyFile
fuente
createReadStream
ycreateWriteStream
de errores, por lo que no se pueden conseguir una sola línea (aunque seguiría siendo igual de rápido).cp test.log newLog.log
vía RAWrequire('child_process').exec
?copy
no es portátil en Windows, al contrario de una solución completa de Node.js.child_process.execFile('/bin/cp', ['--no-target-directory', source, target])
.fs.createReadStream('./init/xxx.json').pipe(fs.createWriteStream('xxx.json'));
Mismo mecanismo, pero esto agrega manejo de errores:
fuente
WriteStream
solo lo eliminará. Tendrías que llamarte ard.destroy()
ti mismo. Al menos eso es lo que me pasó. Lamentablemente, no hay mucha documentación, excepto del código fuente.cb
soporte? ¿Qué debemos pasar como tercer argumento?No pude hacer que el
createReadStream/createWriteStream
método funcionara por alguna razón, pero usando elfs-extra
módulo npm funcionó de inmediato. Sin embargo, no estoy seguro de la diferencia de rendimiento.fs-extra
npm install --save fs-extra
fuente
fs.copy(src, dst, callback);
, y estos deberían resolver la preocupación de @ mvillar.Desde Node.js 8.5.0 tenemos los nuevos métodos fs.copyFile y fs.copyFileSync .
Ejemplo de uso:
fuente
copyFile()
produce un error al sobrescribir archivos más largos. Cortesía deuv_fs_copyfile()
till Node v8.7.0 (libuv 1.15.0). ver github.com/libuv/libuv/pull/1552Rápido de escribir y cómodo de usar, con gestión de promesas y errores.
Lo mismo con la sintaxis async / await:
fuente
new Promise(function(resolve, reject) { resolve(1); resolve(2); reject(3); reject(4); console.log("DONE"); }).then(console.log.bind(console), function(e){console.log("E", e);});
y busqué las especificaciones sobre esto y tienes razón: intentar resolver o rechazar una promesa resuelta no tiene ningún efecto. ¿Quizás podría extender su respuesta y explicar por qué ha escrito la función de esta manera? Gracias :-)close
debe serfinish
para las secuencias de escritura./dev/stdin
, ese es un error github.com/joyent/node/issues/25375Bueno, generalmente es bueno evitar las operaciones asíncronas de archivos. Aquí está el breve ejemplo de sincronización (es decir, sin manejo de errores):
fuente
*Sync
métodos está totalmente en contra de la filosofía de nodejs! También creo que están siendo desaprobados lentamente. La idea general de nodejs es que es de un solo subproceso y está controlada por eventos.La solución de Mike Schilling con manejo de errores con un atajo para el controlador de eventos de error.
fuente
Si no le importa que sea asíncrono, y no esté copiando archivos de tamaño gigabyte, y prefiera no agregar otra dependencia solo para una sola función:
fuente
fs.existsSync
llamada debe ser omitida. El archivo podría desaparecer en el tiempo entre lafs.existsSync
llamada y lafs.readFileSync
llamada, lo que significa que lafs.existsSync
llamada no nos protege de nada.false
sifs.existsSync
falla es probablemente una mala ergonomía porque pocos consumidorescopySync
pensarán en inspeccionar manualmente el valor de retorno cada vez que se llame, más de lo que lo hacemos parafs.writeFileSync
et al. . Lanzar una excepción es realmente preferible.Esto es lo que yo personalmente uso para copiar un archivo y reemplazar otro archivo usando node.js :)
fuente
Para copias rápidas, debe usar la
fs.constants.COPYFILE_FICLONE
bandera. Permite (para los sistemas de archivos que admiten esto) no copiar realmente el contenido del archivo. Solo se crea una nueva entrada de archivo, pero apunta a un "clon" de Copia en escritura del archivo fuente.No hacer nada / menos es la forma más rápida de hacer algo;)
https://nodejs.org/api/fs.html#fs_fs_copyfile_src_dest_flags_callback
Usando promesas en su lugar:
fuente
fs.promises.copyFile
La solución de benweet verifica la visibilidad del archivo antes de la copia:
fuente
¿Por qué no usar nodejs integrado en la función de copia?
Proporciona versiones asíncronas y sincronizadas:
https://nodejs.org/api/fs.html#fs_fs_copyfilesync_src_dest_flags
fuente
La solución de Mike , pero con promesas:
fuente
Mejora de otra respuesta.
caracteristicas:
promise
, lo que facilita su uso en un proyecto más grande.Uso:
Código:
fuente
Todas las soluciones anteriores que no comprueban la existencia de un archivo fuente son peligrosas ... por ejemplo
de lo contrario, existe un riesgo en un escenario en caso de que el origen y el destino sean reemplazados por error, sus datos se perderán permanentemente sin notar ningún error.
fuente