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.