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
createReadStreamycreateWriteStreamde errores, por lo que no se pueden conseguir una sola línea (aunque seguiría siendo igual de rápido).cp test.log newLog.logvía RAWrequire('child_process').exec?copyno 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
WriteStreamsolo 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.cbsoporte? ¿Qué debemos pasar como tercer argumento?No pude hacer que el
createReadStream/createWriteStreammétodo funcionara por alguna razón, pero usando elfs-extramódulo npm funcionó de inmediato. Sin embargo, no estoy seguro de la diferencia de rendimiento.fs-extra
npm install --save fs-extrafuente
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 :-)closedebe serfinishpara 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
*Syncmé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.existsSyncllamada debe ser omitida. El archivo podría desaparecer en el tiempo entre lafs.existsSyncllamada y lafs.readFileSyncllamada, lo que significa que lafs.existsSyncllamada no nos protege de nada.falsesifs.existsSyncfalla es probablemente una mala ergonomía porque pocos consumidorescopySyncpensarán en inspeccionar manualmente el valor de retorno cada vez que se llame, más de lo que lo hacemos parafs.writeFileSyncet 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_FICLONEbandera. 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.copyFileLa 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