Comment supprimer tous les fichiers et dossiers dans un répertoire?
À l'aide de C#, comment puis-je supprimer tous les fichiers et dossiers à partir d'un répertoire, mais toujours garder le répertoire racine?
- Ce serait bien si DirectoryInfo avait une méthode comme .Clean();
- ou .DeleteFolders, et DeleteFiles méthodes.
- Vous voulez être au courant que votre Supprime pourrait très facilement lancer une exception si un fichier est verrouillé (ou si vous n'avez pas les droits). Voir la FileInfo.Supprimer une liste d'exceptions.
Vous devez vous connecter pour publier un commentaire.
Si votre répertoire peut avoir de nombreux fichiers,
EnumerateFiles()
est plus efficace queGetFiles()
, parce que lorsque vous utilisezEnumerateFiles()
vous pouvez commencer l'énumération avant de l'ensemble de la collection est retourné, par opposition àGetFiles()
où vous avez besoin de charger l'ensemble de la collection dans la mémoire avant de commencer à énumérer il. Voir cette citation ici:La même chose s'applique à
EnumerateDirectories()
etGetDirectories()
. Ainsi, le code serait:Pour les fins de cette question, il n'y a vraiment aucune raison d'utiliser
GetFiles()
etGetDirectories()
.Directory.Delete(path, true)
prendra soin de tous 🙂file.Delete()
.EnumerateFiles()
est mieux queGetFiles()
si vous avez une énorme quantité de fichiers.Oui, c'est la façon correcte de le faire. Si vous êtes à la recherche pour vous donner un "Propre" (ou, comme je préfère l'appeler, "Vides" de la fonction), vous pouvez créer une méthode d'extension.
Cela vous permettra ensuite de faire quelque chose comme..
Empty
existe en C#, déjà, pourstring
. Si j'ai vu quelque chose d'autre nomméeEmpty
je serais surpris si l'on a modifié l'objet (ou le système de fichiers), au lieu de me donner unbool
qui dit que si elle est vide ou pas. À cause de cela, j'irais avec le nomClean
.Is
(c'est à direIsEmpty
plutôt queEmpty
).None
,Default
, etc. sur mes propres types parce que ces propriétés existent déjà sur d'autres types? Qu'en estClear()
ouClose()
? Ces noms sont répartis à travers toutes sortes de types, et leur signification est assez claire compte tenu de leur contexte.GetFiles()
etGetDirectories()
à chaque itération? Ne serait-il pas rapide pour avoir unString[]
déclarée et définie àGetFiles()
et un autre a déclaré et mis àGetDirectories()
et ensuite les utiliser dans la boucle?DirectoryInfo
du répertoire que vous souhaitez supprimer de manière récursive, il suffit d'appelerinfo.Delete(true)
.Le code suivant va effacer le dossier de manière récursive:
Nous pouvons aussi montrer de l'amour pour LINQ:
Remarque que ma solution n'est pas performant, parce que je suis en utilisant
Get*().ToList().ForEach(...)
qui génère le mêmeIEnumerable
deux fois. J'utilise une méthode d'extension pour éviter ce problème:C'est la méthode d'extension:
foreach (var dir in info.GetDirectories("*", SearchOption.AllDirectories).OrderByDescending(dir => dir.FullName.Length)) dir.Delete();
pourrait être utile.directory.EnumerateFiles()
etdirectory.EnumerateDirectories()
au lieu de ladirectory.Get*()
méthodes.IEnumerable<T>.ForEach()
extension a un résumé commentaire XML, de "Infraction! Violation! Impur!".Delete
va jeter si le répertoire n'existe pas, de sorte qu'il serait plus sûr de faire uneDirectory.Exists
vérifier d'abord.try-catch
.Directory.Create(@"C:\Temp");
ensuite, il est la réponse parfaite pour moi.Directory.Create
parce que le récursiveDirectory.Delete
est malheureusement pas garanti d'être synchrone..La façon la plus simple:
Être conscient que cela peut effacer certaines autorisations sur le dossier.
Si vous le savez il n'y a pas de sous-dossiers, quelque chose comme cela peut être le plus facile:
De chaque méthode que j'ai essayé, ils ont échoué à un certain point avec le Système.IO erreurs. La méthode suivante fonctionne pour vous, même si le dossier est vide ou n'est pas, en lecture seule ou non, etc.
Le code suivant va nettoyer le répertoire, mais laissez le répertoire racine de y (récursif).
Voici l'outil que j'ai terminé avec après avoir lu tous les posts.
Il ne
Il traite avec
Il n'utilise pas de Répertoire.Supprimer parce que le processus est interrompu sur l'exception.
Juste en utilisant des méthodes statiques avec de Fichier et de Répertoire au lieu de FileInfo et DirectoryInfo permettra d'effectuer plus rapidement. (voir accepté de répondre à Quelle est la différence entre un Fichier et FileInfo en C#?). Réponse montré que l'utilité de la méthode.
Dans Windows 7, si vous avez créé manuellement avec l'Explorateur de Windows, le répertoire de la structure est semblable à celui-ci:
Et d'exécuter le code proposé dans la question d'origine pour nettoyer le répertoire C:\AAA la ligne
di.Delete(true)
échoue toujours avec IOException "Le répertoire n'est pas vide" lorsque vous essayez de supprimer BBB. C'est probablement à cause d'une sorte de retards/mise en cache dans l'Explorateur Windows.Le code suivant fonctionne de manière fiable pour moi:
Cette version n'utilise pas les appels récursifs, et résout le readonly problème.
utilisation DirectoryInfo de la méthode GetDirectories.
L'exemple suivant montre comment vous pouvez le faire. Il crée d'abord certains répertoires et fichiers, puis les supprime via
Directory.Delete(topPath, true);
:Il est pris de https://msdn.microsoft.com/en-us/library/fxeahc5f(v=vs. 110).aspx.
Ce n'est pas la meilleure façon de faire face avec la question ci-dessus. Mais c'est un autre...
cela montrera la façon dont nous supprimer le dossier et vérifiez pour cela nous utilisons la zone de Texte
Appel de la principale
Ajouter cette méthode
De supprimer le dossier, c'est le code à l'aide de la zone de Texte et un bouton
using System.IO;
:Directory.CreateDirectory
La seule chose que vous devez faire est de mettre en
optional recursive parameter
àTrue
.Directory.Delete("C:\MyDummyDirectory", True)
Grâce à .NET. 🙂
Vous n'avez pas besoin de plus