existe-t-il un moyen de supprimer tous les fichiers et sous-répertoires d'un répertoire spécifié sans itération sur eux?
La solution non élégante: P>
public static void EmptyDirectory(string path) { if (Directory.Exists(path)) { // Delete all files foreach (var file in Directory.GetFiles(path)) { File.Delete(file); } // Delete all folders foreach (var directory in Directory.GetDirectories(path)) { Directory.Delete(directory, true); } } }
4 Réponses :
Pourquoi n'est-ce pas élégant? C'est propre, très lisible et fait le travail. P>
Comment sur System.IO.Directory.Delete? Il a une option de récursion, vous l'utilisez même. Examen de votre code On dirait que vous essayez de faire quelque chose d'un peu différent - videz le répertoire sans la supprimer, non? Eh bien, vous pouvez le supprimer et le recréer de nouveau :)
Dans tous les cas, vous (ou une méthode que vous utilisez) doit se déplacer sur tous les fichiers et sous-répertoires. Cependant, vous pouvez itérer à la fois des fichiers et des répertoires en même temps, en utilisant getfilesysteminfos : p>
C'est une belle solution, mais je ne vois pas comment il est plus élégant que le code d'origine. Je ne comprends tout simplement pas quel est le problème.
Cela laisser tomber toutes les métadonnées, telles que les ACL et les horodatages. Cela peut être acceptable ou non pour un cas d'utilisation donné
@jpaugh Suppression et la création de répertoires feraient cela, mais ce n'est pas ce que cette solution fait. Aucun ACLS ou TIMESTAMPS ne sera perdu, sauf sur les fichiers supprimés, ce qui, bien sûr, va perdre toutes les informations relatives à ces fichiers, je ne peux pas imaginer d'attendre quoi que ce soit d'autre si le fichier est parti permanent.
@Bluemonkmn "Eh bien, vous pouvez le supprimer et le reconstituer." Dites-vous que cela ne correspond pas à votre code? Je n'ai certes pas regardé le code de près au début.
@JPaugh oui, c'est exactement ce que je dis. Cela a été présenté comme une option idiote (donc l'emoji), mais le code met en œuvre une solution plus sérieuse, introduite par "après ré-interpréter votre question, c'est le meilleur que j'ai" ... une solution différente.
@Bluemonkmn Peut-être que je suis dense, mais je ne l'ai pas eu très vite. J'espère que mes modifications sont conformes à vos pensées (années d'âge!)).
Eh bien, vous pouvez toujours utiliser simplement l'annuaire.Delete .... p>
http://msdn.microsoft.com /en-us/library/aa328748%28vs.71%29.aspx P>
ou si vous voulez avoir envie, utilisez WMI pour supprimer le répertoire. P>
Si j'interprète son poste correctement, il ne veut pas supprimer le répertoire, uniquement les fichiers et les sous-répertoires.
Yeh, vrai, mais annuaire.delete est toujours le meilleur moyen. Suppression du répertoire et recréer un vide à sa place est plus "élégant" et probablement plus rapide que l'itération.
Cette approche ne conserve aucune autorisation de répertoire non héritée.
Voici une méthode d'extension basée sur le code d'origine OPS, que je pense, c'est bien et un peu plus lisible que d'autres options.
Je suis d'accord, il serait agréable d'avoir une seule méthode dans le cadre pour supprimer le contenu d'un répertoire sans supprimer le répertoire, mais à mon avis, c'est la prochaine meilleure chose. P>
using System; using System.IO; namespace YourNamespace { public static class DirectoryInfoExtensions { public static void EmptyDirectory(this DirectoryInfo di) { if (di.Exists) { foreach (var file in di.GetFiles()) { file.Delete(); } foreach (var directory in di.GetDirectories()) { directory.Delete(true); } } } } }
social.msdn.microsoft.com/forums/vstudio/en-us/...