En mi aplicación Node, necesito eliminar un directorio que tiene algunos archivos, pero fs.rmdirsolo funciona en directorios vacíos. ¿Cómo puedo hacer esto?
node.js
filesystems
sachin
fuente
fuente

fs.readdir(dirPath)para una variedad de rutas en una carpeta, repitafs.unlink(filename)para eliminar cada archivo y, finalmente,fs.rmdir(dirPath)para eliminar la carpeta ahora vacía. Si necesita recurrir, verifiquefs.lstat(filename).isDirectory().Respuestas:
Hay un módulo para esto llamado
rimraf( https://npmjs.org/package/rimraf ). Proporciona la misma funcionalidad querm -RfUso asíncrono :
Uso de sincronización :
fuente
deleteFolderRecursiveen la siguiente respuesta?recursiveopción: stackoverflow.com/a/57866165/6269864Para eliminar la carpeta sincrónicamente
fuente
var curPath = path + "/" + file;convar curPath = p.join(path, file);el módulo de ruta incluido:var p = require("path")path.join(dirpath, file)debería ser mejor quepath + "/" + fileLa mayoría de las personas que usan
fsNode.js desearían funciones cercanas a la "forma Unix" de tratar con archivos. Estoy usando fs-extra para traer todas las cosas geniales:Aún mejor, fs-extra es una caída en el reemplazo de fs nativos. Todos los métodos en fs no se modifican y se adjuntan a él. Significa que puede reemplazar fs por fs-extra :
Y luego puede eliminar una carpeta de esta manera:
fuente
removeSync('/tmp/myFolder')A partir de 2019 ...
A partir de Node.js 12.10.0 ,
fs.rmdirSyncadmiterecursiveopciones, por lo que finalmente puede hacer:Donde la
recursiveopción elimina todo el directorio de forma recursiva.fuente
recursive: truey elimina las carpetas no vacías sin quejas.fs.rmdir(path[, options], callback)ofs.rmdirSync(path[, options])fs.rmdires experimental con estabilidad 1. "Estabilidad: 1 - Experimental. La función no está sujeta a las reglas de versiones semánticas. Pueden ocurrir cambios o eliminaciones compatibles con versiones anteriores. versión futura. El uso de la función no se recomienda en entornos de producción ".Mi respuesta modificada de @oconnecp ( https://stackoverflow.com/a/25069828/3027390 )
Utiliza path.join para una mejor experiencia multiplataforma. Por lo tanto, no olvides exigirlo.
También cambió el nombre de la función a
rimraf;)fuente
Por lo general, no resucito hilos viejos, pero hay mucho en abandono aquí y sin la respuesta de rimraf, todo esto me parece demasiado complicado.
Primero en el Nodo moderno (> = v8.0.0) puede simplificar el proceso utilizando solo módulos centrales de nodo, completamente asíncrono, y paralelizar la desvinculación de archivos simultáneamente en una función de cinco líneas y aún así mantener la legibilidad:
En otra nota, una protección para ataques transversales de ruta es inapropiada para esta función porque
rm -rfen que toma un argumento y permitirá al usuariorm -rf /si se le solicita. Sería responsabilidad de un script proteger elrmprograma en sí mismo..isDirectory()esfalsepara SYM-enlaces y no estén disociados en recursed.Por último, pero no menos importante, existe una rara condición de carrera en la que la recursión podría producir un error si una de las entradas se desvincula o se elimina fuera de este script en el momento justo mientras se ejecuta esta recursión. Dado que este escenario no es típico en la mayoría de los entornos, es probable que se lo pase por alto. Sin embargo, si es necesario (para algunos casos extremos), este problema se puede mitigar con este ejemplo un poco más complejo:
EDITAR: hacer
isDirectory()una función. Elimine el directorio real al final. Arregla la recursión faltante.fuente
awaita suPromise.all(…); ¿Es esto intencional? Parece que en su estado actualresults.forEachiteraría sobre las promesas, mientras que el código espera iterar sobre los resultados. ¿Me estoy perdiendo de algo?if (!fs.existsSync(dir)) returnreaddirarrojará un error como debería. Sirmdir non-existing-direl código de salida es un error. Sería responsabilidad del consumidor intentar / atrapar. Este es el mismo método descrito en los documentos del nodo cuando se trata de usar funciones fs. Esperan que intente / atrape y mire los errorescodepara determinar qué hacer. Un control adicional introduce una condición de carrera.fs.existsse utiliza la versión síncrona de . PD: esta es una gran solución.Aquí hay una versión asíncrona de la respuesta de @ SharpCoder
fuente
Escribí esta función llamada eliminar carpeta. Eliminará recursivamente todos los archivos y carpetas en una ubicación. El único paquete que requiere es asíncrono.
fuente
Si está utilizando el nodo 8+ quiere asincronicidad y no quiere dependencias externas, aquí está la versión asíncrona / espera:
fuente
Versión asíncrona de la respuesta de @ SharpCoder usando fs.promises:
fuente
Llegué aquí mientras trataba de terminar con el
gulpy estoy escribiendo para mayores alcances.gulp-cleanen desuso porgulp-rimrafgulp-rimrafen desuso a favor dedelete-files-foldersCuando desee eliminar archivos y carpetas usando
del, debe agregar/**una eliminación recursiva.fuente
El paquete de facto es
rimraf, pero aquí está mi pequeña versión asíncrona:fuente
En la última versión de Node.js (12.10.0 o posterior), las
rmdirfunciones de estilofs.rmdir(),fs.rmdirSync()yfs.promises.rmdir()tienen una nueva opción experimentalrecursiveque permite eliminar directorios no vacíos, por ejemplo,El PR relacionado en GitHub: https://github.com/nodejs/node/pull/29168
fuente
De acuerdo con la
fsdocumentación ,fsPromisesactualmente proporciona larecursiveopción de forma experimental, que, al menos en mi propio caso en Windows, elimina el directorio y los archivos que contiene.¿
recursive: trueElimina los archivos en Linux y MacOS?fuente
Ultra-velocidad y a prueba de fallas
Puede usar el
lignatorpaquete ( https://www.npmjs.com/package/lignator ), es más rápido que cualquier código asíncrono (por ejemplo, rimraf) y más a prueba de fallas (especialmente en Windows, donde la eliminación de archivos no es instantánea y los archivos pueden estar bloqueado por otros procesos).fuente
La carpeta de sincronización se elimina con los archivos o solo con un archivo.
No soy muy generoso ni colaborador, pero no pude encontrar una buena solución a este problema y tuve que encontrar el camino ... así que espero que les guste :)
Funciona perfecto para mí con cualquier número de directorios anidados y subdirectorios. Tenga cuidado con el alcance de 'esto' cuando recurra la función, su implementación puede ser diferente. En mi caso, esta función permanece en el retorno de otra función, por eso la llamo con esto.
fuente
Mientras que
recursivees una opción experimental defs.rmdirfuente
Actualización 2020
Desde la versión 12.10.0 recursiveOption se ha agregado para las opciones.
Tenga en cuenta que la eliminación recursiva es experimental .
Entonces lo harías para la sincronización:
o para asíncrono:
fuente
¡Solo usa el módulo rmdir ! Es fácil y simple.
fuente
Otra alternativa es usar el
fs-promisemódulo que proporciona versiones prometidas de losfs-extramódulos.entonces podrías escribir como este ejemplo:
nota: async / await requiere una versión reciente de nodejs (7.6+)
fuente
Una forma rápida y sucia (tal vez para probar) podría ser usar directamente el método
execospawnpara invocar la llamada del sistema operativo para eliminar el directorio. Lea más sobre NodeJs child_process .Los inconvenientes son:
Beneficios:
fuente
-fbandera para estar seguro, o asegurarse mientras escribe que él / ella no va a eliminar todo.exec + rmes un comando válido y útil en el nodo que uso a menudo durante las pruebas.Desearía que hubiera una manera de hacer esto sin módulos adicionales para algo tan minúsculo y común, pero esto es lo mejor que se me ocurrió.
Actualización: ahora debería funcionar en Windows (probado Windows 10), y también debería funcionar en sistemas Linux / Unix / BSD / Mac.
fuente
child_process.execFileque no invoque el shell y, en su lugar, pase argumentos explícitamente.Este es un enfoque que utiliza promisify y dos funciones de ayuda (to and toAll) para resolver la promesa.
Realiza todas las acciones de forma asíncrona.
fuente
// sin el uso de ninguna biblioteca de terceros
fuente
fs.unllinkSync(path.join(FOLDER_PATH, element);fuente