2009-07-26 8 views
6

Y at-il un moyen de supprimer tous les fichiers & sous-répertoires d'un répertoire spécifié sans répéter sur eux?Quelle est la meilleure façon de vider un répertoire?

La solution non élégante:

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); 
     } 
    } 
} 
+0

http://social.msdn.microsoft.com/Forums/vstudio/en-US/2239b45a-3f19-4a2a-b5cd-050b3ee32b9d/how-can-i-check-folder-is-empty-or-not ? forum = csharpgeneral –

Répondre

10

Que diriez-vous de System.IO.Directory.Delete? Il a une option de récursivité, vous l'utilisez même. En examinant votre code, il semble que vous essayez de faire quelque chose de légèrement différent - vider le répertoire sans le supprimer, n'est-ce pas? Eh bien, vous pouvez le supprimer et recréer :)


Dans tous les cas, vous (ou une méthode utilisée) doit itérer sur tous les fichiers et sous-répertoires. Cependant, vous pouvez parcourir les fichiers et répertoires en même temps, en utilisant GetFileSystemInfos:

foreach(System.IO.FileSystemInfo fsi in 
    new System.IO.DirectoryInfo(path).GetFileSystemInfos()) 
{ 
    if (fsi is System.IO.DirectoryInfo) 
     ((System.IO.DirectoryInfo)fsi).Delete(true); 
    else 
     fsi.Delete(); 
} 
+0

C'est une bonne solution, mais je ne vois pas comment c'est plus élégant que le code original. Je ne comprends tout simplement pas quel est le problème. –

+0

Cela supprimera 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

+0

@jpaugh Supprimer et recréer des répertoires le ferait, mais ce n'est pas ce que fait cette solution. Aucune ACL ou horodatage ne sera perdu sauf sur les fichiers supprimés, qui, bien sûr, vont perdre toutes les informations relatives à ces fichiers, je ne peux pas m'attendre à autre chose si le fichier est définitivement disparu. – BlueMonkMN

3

Pourquoi est-ce pas élégant? C'est propre, très lisible et fait le travail.

2

Eh bien, vous pouvez toujours utiliser simplement Directory.Delete ....

http://msdn.microsoft.com/en-us/library/aa328748%28VS.71%29.aspx

Ou si vous voulez avoir envie, utilisez WMI pour supprimer le répertoire.

+0

Si j'interprète son message correctement, il ne veut pas supprimer le répertoire, seulement les fichiers et sous-répertoires qu'il contient. –

+1

Yeh, c'est vrai, mais Directory.Delete est toujours le meilleur moyen. Supprimer le répertoire et en recréer un vide est plus "élégant" et probablement plus rapide que l'itération. – TheSmurf

+0

Cette approche ne conserverait aucune autorisation de répertoire non héritée. – Craig

Questions connexes