2009-07-26 28 views
6

¿Hay alguna manera de eliminar todos los archivos & subdirectorios de un directorio específico sin iterar sobre ellos?¿Cuál es la mejor manera de vaciar un directorio?

La solución no 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 –

Respuesta

10

¿Qué hay de System.IO.Directory.Delete? Tiene una opción de recursión, incluso la está usando. Al revisar tu código, parece que intentas hacer algo ligeramente diferente: vaciar el directorio sin eliminarlo, ¿verdad? Bueno, podrías eliminarlo y volver a crearlo :)


En cualquier caso, usted (o algún método que usa) debe iterar sobre todos los archivos y subdirectorios. Sin embargo, puede iterar sobre los archivos y directorios al mismo tiempo, utilizando 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

Esa es una buena solución, pero no veo cómo es más elegante que el código original. Simplemente no entiendo cuál es el problema. –

+0

Esto soltará todos los metadatos, como ACL y marcas de tiempo. Esto puede o no ser aceptable para un caso de uso dado – jpaugh

+0

@jpaugh Eliminar y volver a crear directorios lo haría, pero eso no es lo que hace esta solución. No se perderán ACL o marcas de tiempo, excepto en los archivos que se eliminan, lo que, por supuesto, va a perder toda la información relacionada con esos archivos, no puedo imaginarme esperando nada más si el archivo se ha ido de forma permanente. – BlueMonkMN

3

¿Por qué es que no elegante? Es limpio, muy legible y hace el trabajo.

2

Bueno, siempre se puede simplemente usar Directory.Delete ....

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

O si quieres ser elegante, utiliza WMI para eliminar el directorio.

+0

Si interpreto su publicación correctamente, él no desea eliminar el directorio, solo los archivos y subdirectorios en él. –

+1

Sí, cierto, pero Directory.Delete sigue siendo la mejor manera. Eliminar el directorio y recrear uno vacío en su lugar es más "elegante" y probablemente más rápido que la iteración. – TheSmurf

+0

Ese enfoque no retendría ningún permiso de directorio no heredado. – Craig

Cuestiones relacionadas