Dans mon application Node, je dois supprimer un répertoire contenant certains fichiers, mais fs.rmdir
ne fonctionne que sur des répertoires vides. Comment puis-je faire ceci?
node.js
filesystems
sachin
la source
la source
fs.readdir(dirPath)
pour un tableau de chemins dans un dossier, parcourezfs.unlink(filename)
pour supprimer chaque fichier, puis enfinfs.rmdir(dirPath)
pour supprimer le dossier désormais vide. Si vous avez besoin de rechuter, vérifiezfs.lstat(filename).isDirectory()
.Réponses:
Il existe un module pour cela appelé
rimraf
( https://npmjs.org/package/rimraf ). Il fournit les mêmes fonctionnalités querm -Rf
Utilisation asynchrone :
Utilisation de la synchronisation :
la source
deleteFolderRecursive
dans la réponse suivante?recursive
option: stackoverflow.com/a/57866165/6269864Pour supprimer un dossier de manière synchrone
la source
var curPath = path + "/" + file;
parvar curPath = p.join(path, file);
le module de chemin d'accès fourni:var p = require("path")
path.join(dirpath, file)
devrait être mieux quepath + "/" + file
La plupart des gens qui utilisent
fs
Node.js souhaiteraient des fonctions proches de la "façon Unix" de traiter les fichiers. J'utilise fs-extra pour apporter toutes les choses intéressantes:Encore mieux, fs-extra est une baisse du remplacement des fs natifs. Toutes les méthodes de fs ne sont pas modifiées et y sont attachées. Cela signifie que vous pouvez remplacer fs par fs-extra :
Et puis vous pouvez supprimer un dossier de cette façon:
la source
removeSync('/tmp/myFolder')
À partir de 2019 ...
Depuis Node.js 12.10.0 ,
fs.rmdirSync
prend en charge unerecursive
option, vous pouvez donc enfin faire:Où l'
recursive
option supprime le répertoire entier de manière récursive.la source
recursive: true
et supprime les dossiers non vides sans se plaindre.fs.rmdir(path[, options], callback)
oufs.rmdirSync(path[, options])
fs.rmdir
expérimental avec la stabilité 1. "Stabilité: 1 - Expérimentale. La fonctionnalité n'est pas soumise aux règles de version sémantique. Des modifications ou suppressions non rétrocompatibles peuvent se produire dans n'importe quel version future. L'utilisation de cette fonctionnalité n'est pas recommandée dans les environnements de production. "Ma réponse modifiée de @oconnecp ( https://stackoverflow.com/a/25069828/3027390 )
Utilise path.join pour une meilleure expérience multiplateforme. Alors, n'oubliez pas de l'exiger.
Fonction également renommée en
rimraf
;)la source
Je ne ressuscite pas d'habitude de vieux fils mais il y a beaucoup de choses ici et sans la réponse du rimraf, tout cela me semble trop compliqué.
Tout d'abord dans Node moderne (> = v8.0.0), vous pouvez simplifier le processus en utilisant uniquement des modules de base de nœud, entièrement asynchrones, et paralléliser la dissociation de fichiers simultanément, le tout dans une fonction de cinq lignes, tout en conservant la lisibilité:
Par ailleurs, une protection contre les attaques de traversée de chemin n'est pas appropriée pour cette fonction car
rm -rf
dans la mesure où il prend un argument et permettra à l'utilisateur de lerm -rf /
demander. Ce serait la responsabilité d'un script de ne pas garder lerm
programme lui-même..isDirectory()
c'est le casfalse
pour les liens sym et sont dissociés et non récurrents.Dernier point mais non le moindre, il existe une condition de concurrence rare que la récursivité puisse générer une erreur si l'une des entrées a été dissociée ou supprimée en dehors de ce script au bon moment pendant l'exécution de cette récursivité. Étant donné que ce scénario n'est pas typique dans la plupart des environnements, il peut probablement être ignoré. Cependant, si nécessaire (pour certains cas marginaux), ce problème peut être atténué avec cet exemple légèrement plus complexe:
EDIT: créer
isDirectory()
une fonction. Supprimez le répertoire réel à la fin. Correction de la récursion manquante.la source
await
à votrePromise.all(…)
; est-ce intentionnel? Il semble que dans son état actuel,results.forEach
il répéterait les promesses, tandis que le code s'attend à répéter les résultats. Suis-je en train de manquer quelque chose?if (!fs.existsSync(dir)) return
readdir
va lancer une erreur comme il se doit. Si vousrmdir non-existing-dir
le code de sortie est une erreur. Il serait de la responsabilité du consommateur d'essayer / attraper. Il s'agit de la même méthode que celle décrite dans les documents Node pour l'utilisation des fonctions fs. Ils s'attendent à ce que vous essayiez / attrapiez et regardiez les erreurscode
pour déterminer quoi faire. Un contrôle supplémentaire introduit une condition de concurrence.fs.exists
est utilisée. PS c'est une excellente solution.Voici une version asynchrone de la réponse de @ SharpCoder
la source
J'ai écrit cette fonction appelée supprimer le dossier. Il supprimera récursivement tous les fichiers et dossiers d'un emplacement. Le seul package dont il a besoin est async.
la source
Si vous utilisez le noeud 8+, vous voulez asyncronicité et ne voulez pas de dépendances externes, voici la version asynchrone / wait:
la source
Version asynchrone de la réponse de @ SharpCoder à l' aide de fs.promises:
la source
Je suis arrivé ici en essayant d'en finir avec le
gulp
et j'écris pour plus de portée.gulp-clean
déconseillé pourgulp-rimraf
gulp-rimraf
déconseillé au profit dedelete-files-folders
Lorsque vous souhaitez supprimer des fichiers et des dossiers à l'aide
del
, vous devez ajouter/**
une suppression récursive.la source
Le package de facto l'est
rimraf
, mais voici ma petite version asynchrone:la source
Dans la dernière version de Node.js (12.10.0 ou plus tard), les
rmdir
fonctions de stylefs.rmdir()
,fs.rmdirSync()
etfs.promises.rmdir()
ont une nouvelle option expérimentalerecursive
qui permet de supprimer des répertoires non vides, par exempleLe PR associé sur GitHub: https://github.com/nodejs/node/pull/29168
la source
Selon la
fs
documentation ,fsPromises
fournit actuellement l'recursive
option à titre expérimental, qui, au moins dans mon cas sous Windows, supprime le répertoire et tous les fichiers qu'il contient.Ne
recursive: true
supprimez les fichiers sous Linux et Mac OS?la source
Ultra-rapide et infaillible
Vous pouvez utiliser le
lignator
package ( https://www.npmjs.com/package/lignator ), il est plus rapide que tout code asynchrone (par exemple rimraf) et plus résistant aux défaillances (en particulier dans Windows, où la suppression de fichiers n'est pas instantanée et les fichiers peuvent être verrouillé par d'autres processus).la source
Supprimer le dossier de synchronisation avec les fichiers ou uniquement un fichier.
Je ne suis pas un grand donateur ni un contributeur mais je n'ai pas pu trouver une bonne solution à ce problème et j'ai dû trouver mon chemin ... alors j'espère que vous l'aimerez :)
Fonctionne parfaitement pour moi avec n'importe quel nombre de répertoires et sous-répertoires imbriqués. Attention à la portée de «ceci» lors de la récursivité de la fonction, votre implémentation peut être différente. Dans mon cas, cette fonction reste dans le retour d'une autre fonction, c'est pourquoi je l'appelle avec cela.
la source
Bien que
recursive
soit une option expérimentale defs.rmdir
la source
Mise à jour 2020
Depuis la version 12.10.0 recursiveOption a été ajoutée pour les options.
Notez que la suppression récursive est expérimentale .
Vous feriez donc pour la synchronisation:
ou pour async:
la source
Utilisez simplement le module rmdir ! c'est facile et simple.
la source
Une autre alternative consiste à utiliser le
fs-promise
module qui fournit des versions promises desfs-extra
modulesvous pourriez alors écrire comme cet exemple:
note: async / expect nécessite une version récente de nodejs (7.6+)
la source
Un moyen rapide et sale (peut-être pour les tests) pourrait être d'utiliser directement la méthode
exec
ouspawn
pour appeler l'appel du système d'exploitation pour supprimer le répertoire. En savoir plus sur NodeJs child_process .Les inconvénients sont:
Avantages:
la source
-f
drapeau pour être sûr, ou s'assurer en tapant qu'il ne va pas tout supprimer.exec + rm
est une commande valide et utile dans le nœud que j'utilise souvent pendant les tests.Je souhaite qu'il y ait un moyen de le faire sans modules supplémentaires pour quelque chose d'aussi minuscule et commun, mais c'est le meilleur que j'ai pu trouver.
Mise à jour: Devrait maintenant fonctionner sur Windows (testé Windows 10), et devrait également fonctionner sur les systèmes Linux / Unix / BSD / Mac.
la source
child_process.execFile
qui n'invoque pas le shell et passez des arguments explicitement à la place.Il s'agit d'une approche utilisant promisify et deux fonctions d'aide (to et toAll) pour résoudre la promesse.
Il effectue toutes les actions de manière asynchrone.
la source
// sans utilisation d'une bibliothèque tierce
la source
fs.unllinkSync(path.join(FOLDER_PATH, element);
la source