2015-12-14 26 views
5

sto usando questa soluzione per eliminare tutte le cartelle e le sottodirectory vuote in un certo percorso:Eliminare tutte le cartelle e le sottodirectory che non hanno un file di certa estensione

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

Funziona perfettamente. Ma voglio eliminare tutte le cartelle vuote e anche le cartelle che non sono vuote ma non contengono file con l'estensione .dvr.

Ad esempio, la mia cartella ha i file:

a.log

b.log

c.dvr

d.dat

Così questa cartella non può essere cancellata, poiché contiene un file con l'estensione dvr.

Come posso filtrarlo? (Sto usando GTK # ma credo che il codice C# funzionerà, poiché questa soluzione è un codice C#

risposta

5

Sfortunatamente la gestione degli errori è un'eccezione basata sulle operazioni IO. E Directory.Delete genera IOException se la directory non è vuota. Quindi dovrete eliminare i file manualmente:

+0

La tua soluzione ha funzionato meglio dopo alcune modifiche. GTK # non accetta nessuno(). Quindi ho dovuto usare la lunghezza invece, funziona bene; D – Phiter

2

Vorrei usare Directory.EnumerateFiles per vedere se una directory contiene il file che stai cercando. Modifica del codice:

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

Sono d'accordo. Ho modificato secondo la tua raccomandazione. – Avitus

+1

E dovresti sapere che 'Directory.Delete' genera una IOException se la directory contiene file, quindi devi eliminarli manualmente. –

+0

Funzionerebbe su .net 4.5 o 4.6, penso che GTK # sia .net 2.0, qualsiasi soluzione? – Phiter

0

Avitus answer è corretto, ma in quanto è necessario per lavorare in .NET 2.0, non è possibile utilizzare il metodo EnumerateFiles, tuttavia GetFiles ottiene il lavoro fatto bene. Ma richiede un po 'più di codice.

Esempio:

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

Si potrebbe, in uno spirito di meno codice spostare la chiamata Directory.Delete metodo all'interno del ciclo for, se si voleva, quindi interrompere il loop.