¿Existe una manera más fácil de copiar una carpeta y todo su contenido sin tener que hacer manualmente una secuencia de fs.readir
, fs.readfile
, fs.writefile
de forma recursiva?
Me pregunto si me estoy perdiendo una función que idealmente funcionaría así
fs.copy("/path/to/source/folder","/path/to/destination/folder");
javascript
node.js
lostsource
fuente
fuente
Respuestas:
Puede usar el módulo ncp . Creo que esto es lo que necesitas
fuente
npm install ncp
y trabajando en menos de 30 años. Gracias.Este es mi enfoque para resolver este problema sin módulos adicionales. Solo usando el incorporado
fs
y lospath
módulos.Nota: Esto utiliza las funciones de lectura / escritura de fs, por lo que no copia ningún metadato (hora de creación, etc.). A partir del nodo 8.5 hay
copyFileSync
funciones disponibles que llaman a las funciones de copia del sistema operativo y, por lo tanto, también copian metadatos. Todavía no los probé, pero debería funcionar simplemente reemplazarlos. (Ver https://nodejs.org/api/fs.html#fs_fs_copyfilesync_src_dest_flags )fuente
javascript var fs = require('fs'); var path = require('path');
fs.copy
o,fs.copySync
como realmente llaman, las funciones de copia a nivel del sistema operativo en MacOS y Windows y, por lo tanto, copiar los archivos.fs.copyFile
y si exploras la fuente del nodo que verás en Mac y Windows, llaman a la función específica del sistema operativo para copiar un archivoHay algunos módulos que admiten copiar carpetas con su contenido. El más popular sería la llave inglesa
Una alternativa sería node-fs-extra
fuente
wrench
ha quedado en desuso y debe reemplazarse pornode-fs-extra
( github.com/jprichardson/node-fs-extra )Aquí hay una función que copia recursivamente un directorio y su contenido a otro directorio:
fuente
fs.lstatSync
lugar defs.statSync
)linking
no está copiando ... El problema es que cuando modifica el contenido del archivo vinculado, el archivo original también cambiará.fs-extra
trabajó para mí cuandoncp
y sewrench
quedó corto:https://www.npmjs.com/package/fs-extra
fuente
wrench
dirige a los usuarios a usar,fs-extra
ya que ha dejado de utilizar su biblioteca.Para el sistema operativo Linux / Unix, puede usar la sintaxis de shell
¡Eso es!
fuente
El módulo fs-extra funciona de maravilla.
Instalar fs-extra
El siguiente es el programa para copiar el directorio de origen al directorio de destino.
Referencias
fs-extra: https://www.npmjs.com/package/fs-extra
Ejemplo: Tutorial de NodeJS - Node.js Copiar una carpeta
fuente
Así es como lo haría personalmente:
funciona para carpetas y archivos
fuente
Creé un pequeño ejemplo de trabajo que copia una carpeta de origen a otra carpeta de destino en solo unos pocos pasos (según la respuesta @ shift66 usando ncp):
paso 1 - Instala el módulo ncp:
Paso 2: crea copy.js (modifica los valores srcPath y destPath a lo que necesites):
paso 3 - corre
fuente
Esto es bastante fácil con el nodo 10.
Esto supone
dest
que no existe.fuente
require('util').promisify
confs.mkdir
y enfs.copyFile
lugar derequire('fs').promises
, que todavía es experimental en v11.1.withFileTypes
opción? Porque eso le ahorra unastat
llamadawithFileTypes
opción.Ya sé muchas respuestas aquí, pero nadie respondió de manera simple. En cuanto a la documentación oficial de fs-exra , puedes hacerlo muy fácil
fuente
{ recursive: true }
del documento de Github que mencionaste, No sé si funciona.Como solo estoy creando un script de nodo simple, no quería que los usuarios del script tuvieran que importar un montón de módulos externos y dependencias, así que me puse mi gorra de pensamiento e hice una búsqueda de comandos en ejecución desde el bash cáscara.
Este fragmento de código node.js copia recursivamente una carpeta llamada node-webkit.app en una carpeta llamada build:
Gracias a Lance Pollard en dzone por ayudarme a comenzar.
El fragmento anterior se limita a plataformas basadas en Unix como Mac OS y Linux, pero una técnica similar puede funcionar para Windows.
fuente
@ mallikarjun-m gracias!
¡fs-extra hizo la cosa e incluso puede devolver Promise si no proporciona devolución de llamada! :)
fuente
El que tiene soporte de enlace simbólico + no se lanza si existe un directorio.
fuente
Este código funcionará bien, copiando recursivamente cualquier carpeta a cualquier ubicación. Solo Windows
Funciona perfectamente para mi juego basado en texto para crear nuevos jugadores.
fuente
Intenté fs-extra y copy-dir para copiar-carpeta-recursivamente. pero lo quiero
Entonces escribí el mío:
y una función similar mkdirs, que es una alternativa a mkdirp
fuente
Escribí esta función tanto para copiar (copyFileSync) como para mover (renameSync) archivos recursivamente entre directorios:
fuente
Si está en Linux y el rendimiento no es un problema, puede usar la
exec
función delchild_process
módulo para ejecutar un comando bash:En algunos casos, encontré esta solución más limpia que descargar un módulo completo o incluso usar el
fs
módulo.fuente
ncp bloquea el descriptor de archivo y activa la devolución de llamada cuando aún no se ha desbloqueado. Recomiendo usar el módulo de copia recursiva en su lugar. Admite eventos y puede estar seguro en el final de la copia.
fuente
Tenga cuidado al elegir su paquete. Algunos paquetes como copy-dir no admiten copiar archivos grandes de más de 0x1fffffe8 caracteres de largo. Lanzará algún error como:
He experimentado algo como esto en uno de mis proyectos. Finalmente, tuve que cambiar el paquete que estaba usando y ajustar mucho código. Yo diría que esta no es una experiencia muy agradable.
Si se desea una copia de origen múltiple y de destino múltiple, puede usar una copia mejor y escribir algo como esto:
o incluso :
fuente
SÍ, aunque
ncp
escool
...Es posible que desee / deba prometer su función para hacer es
super cool
. Ya que estás en ello, agrégalo a untools
archivo para reutilizarlo.A continuación se muestra una versión de trabajo que es
Async
y utilizaPromises
.index.js
tools.js
fuente
El enfoque más fácil para este problema es usar solo el módulo 'fs' y 'Path' y algo de lógica .....
Todos los archivos en la carpeta raíz se copian con el Nuevo nombre si lo desea, simplemente configure el número de versión, es decir ....................... "var v = 'Su directorio Nombre'"
en el prefijo del nombre de archivo V contenido agregado con el nombre del archivo.
fuente
Así es como lo hice:
luego:
Entonces llame al método:
fuente