En mi aplicación Node, necesito eliminar un directorio que tiene algunos archivos, pero fs.rmdir
solo 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 -Rf
Uso asíncrono :
Uso de sincronización :
fuente
deleteFolderRecursive
en la siguiente respuesta?recursive
opció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 + "/" + file
La mayoría de las personas que usan
fs
Node.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.rmdirSync
admiterecursive
opciones, por lo que finalmente puede hacer:Donde la
recursive
opción elimina todo el directorio de forma recursiva.fuente
recursive: true
y elimina las carpetas no vacías sin quejas.fs.rmdir(path[, options], callback)
ofs.rmdirSync(path[, options])
fs.rmdir
es 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 -rf
en que toma un argumento y permitirá al usuariorm -rf /
si se le solicita. Sería responsabilidad de un script proteger elrm
programa en sí mismo..isDirectory()
esfalse
para 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
await
a suPromise.all(…)
; ¿Es esto intencional? Parece que en su estado actualresults.forEach
iteraría sobre las promesas, mientras que el código espera iterar sobre los resultados. ¿Me estoy perdiendo de algo?if (!fs.existsSync(dir)) return
readdir
arrojará un error como debería. Sirmdir non-existing-dir
el 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 errorescode
para determinar qué hacer. Un control adicional introduce una condición de carrera.fs.exists
se 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
gulp
y estoy escribiendo para mayores alcances.gulp-clean
en desuso porgulp-rimraf
gulp-rimraf
en desuso a favor dedelete-files-folders
Cuando 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
rmdir
funciones de estilofs.rmdir()
,fs.rmdirSync()
yfs.promises.rmdir()
tienen una nueva opción experimentalrecursive
que 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
fs
documentación ,fsPromises
actualmente proporciona larecursive
opción de forma experimental, que, al menos en mi propio caso en Windows, elimina el directorio y los archivos que contiene.¿
recursive: true
Elimina los archivos en Linux y MacOS?fuente
Ultra-velocidad y a prueba de fallas
Puede usar el
lignator
paquete ( 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
recursive
es una opción experimental defs.rmdir
fuente
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-promise
módulo que proporciona versiones prometidas de losfs-extra
mó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
exec
ospawn
para invocar la llamada del sistema operativo para eliminar el directorio. Lea más sobre NodeJs child_process .Los inconvenientes son:
Beneficios:
fuente
-f
bandera para estar seguro, o asegurarse mientras escribe que él / ella no va a eliminar todo.exec + rm
es 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.execFile
que 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