2009-07-26 27 views
6

C'è un modo per eliminare tutti i file & sottodirectory di una directory specificata senza iterare su di essi?Qual è il modo migliore per svuotare una directory?

La soluzione non elegante:

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 –

risposta

10

E su System.IO.Directory.Delete? Ha un'opzione di ricorsione, lo stai persino usando. Esaminando il tuo codice sembra che tu stia cercando di fare qualcosa di leggermente diverso - svuota la directory senza cancellarla, giusto? Beh, si potrebbe eliminarlo e ricrearlo :)


In ogni caso, è (o qualche metodo utilizzato) deve iterare su tutti i file e le sottodirectory. Tuttavia, è possibile iterare su entrambi i file e le directory allo stesso tempo, utilizzando 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

Questa è una bella soluzione, ma non vedo come sia più elegante del codice originale. Semplicemente non capisco quale sia il problema. –

+0

In questo modo verranno eliminati tutti i metadati, come gli ACL e i timestamp. Questo potrebbe non essere accettabile per un dato caso d'uso – jpaugh

+0

@jpaugh Eliminare e ricreare le directory lo farebbe, ma questo non è ciò che fa questa soluzione. Nessun ACL o timestamp andranno persi tranne che per i file che vengono cancellati, il che, ovviamente, perderà tutte le informazioni relative a quei file, non posso immaginare di aspettarmi altro se il file è definitivamente sparito. – BlueMonkMN

3

Perché non elegante? È pulito, molto leggibile e fa il lavoro.

2

Beh, si può sempre usare appena Directory.Delete ....

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

O se vuoi avere fantasia, usa WMI per cancellare la directory.

+0

Se interpreto correttamente il suo post, non vuole cancellare la directory, ma solo i file e le sottodirectory in essa contenuti. –

+1

Sì, vero, ma Directory.Delete è ancora il modo migliore. Cancellare la directory e ricrearne uno vuoto al suo posto è più "elegante" e probabilmente più veloce dell'iterazione. – TheSmurf

+0

Questo approccio non manterrebbe autorizzazioni di directory non ereditate. – Craig

Problemi correlati