varios una todos script por para los fecha extension eliminar consola carpeta buscar borrar archivos c# directory gtk#

c# - una - Eliminar todas las carpetas y subdirectorios que no tienen un archivo de cierta extensión



eliminar todos los archivos de una carpeta c# (3)

Estoy usando esta solución para eliminar todas las carpetas y subdirectorios vacíos en una ruta determinada:

static void Main(string[] args) { processDirectory(@"c:/temp"); } private static void processDirectory(string startLocation) { foreach (var directory in Directory.GetDirectories(startLocation)) { processDirectory(directory); if (Directory.GetFiles(directory).Length == 0 && Directory.GetDirectories(directory).Length == 0) { Directory.Delete(directory, false); } } }

Funciona perfectamente Pero quiero eliminar todas las carpetas vacías y también las que no están vacías pero que tampoco contienen archivos con la extensión .dvr .

Por ejemplo, mi carpeta tiene los archivos:

un registro

Blog

c.dvr

d.dat

Por lo tanto, esta carpeta no se puede eliminar, ya que contiene un archivo con la extensión dvr.

¿Cómo puedo filtrarlo? (Estoy usando GTK # pero creo que el código C # funcionará, ya que esta solución es un código C #)


Usaría Directory.EnumerateFiles para ver si un directorio contiene el archivo que está buscando. Cambiando tu código para ser:

static void Main(string[] args) { processDirectory(@"c:/temp"); } private static void processDirectory(string startLocation) { foreach (var directory in Directory.GetDirectories(startLocation)) { processDirectory(directory); if (Directory.GetDirectories(directory).Length == 0 || Directory.EnumerateFiles(directory, "*.dvr").Length == 0 ) { Directory.Delete(directory, false); } } }


Desafortunadamente, el manejo de errores está muy basado en excepciones en operaciones IO. Y Directory.Delete lanza una IOException si el directorio no está vacío. Por lo tanto, deberá eliminar los archivos manualmente:

private static bool processDirectory(string startLocation) { bool result = true; foreach (var directory in Directory.GetDirectories(startLocation)) { bool directoryResult = processDirectory(directory); result &= directoryResult; if (Directory.GetFiles(directory, "*.dvr").Any()) { result = false; continue; } foreach(var file in Directory.GetFiles(directory)) { try { File.Delete(file); } catch(IOException) { // error handling result = directoryResult = false; } } if (!directoryResult) continue; try { Directory.Delete(directory, false); } catch(IOException) { // error handling result = false; } } return result; }


La respuesta de Avitus es correcta, pero dado que necesita que funcione en .NET 2.0, no puede usar el método EnumerateFiles , sin embargo, GetFiles hace el trabajo bien. Pero requiere un poco más de código.

Ejemplo:

static void Main(string[] args) { processDirectory(@"c:/temp"); } private static void processDirectory(string startLocation) { foreach (var directory in Directory.GetDirectories(startLocation)) { processDirectory(directory); if (Directory.GetDirectories(directory).Length == 0)) { bool delete = false; var files = Directory.GetFiles(directory); // This will delete the directory if it contains a file with the Extension // of .dvr, regardless if there are other files in there. Might be something you want to change. for (int i = 0; i < files.Length && !delete; i++) { delete = files[i].Extension.Equals(".dvr", StringComparison.OrdinalIgnoreCase); } if (delete) { // Recursive must be set to true in order to // delete files and sub-directories in the folder. // This folder will not have any sub-directories // so it''s only used to delete the files. Directory.Delete(directory, /*recursive*/ true); } } } }

En el espíritu de menos código, puede mover la llamada al método Directory.Delete dentro del ciclo for , si lo desea, luego cortar el ciclo.