2012-11-28 2 views
5

Aby wyczyścić pliki testowe, próbuję wykonać poniższe czynności. Ale nie kasuje plików, jak również nie generuje błędu.Rekursywnie usuwaj pliki z katalogu, ale zachowaj nienaruszoną strukturę katalogu.

Czy brakuje mi czegoś oczywistego?

private void CleanUpTempDirFiles() 
    { 
     var fileGenerationDir = new DirectoryInfo(Path.Combine(Path.GetTempPath(), "TestFilesDir")); 

     fileGenerationDir.GetDirectories().ToList().ForEach(dir => dir.GetFiles().ToList().ForEach(file => file.Delete())); 
    } 
+0

Wypróbuj debugger. Pomaga ustalić, co program robi w czasie wykonywania. To znacznie lepsze niż * patrzenie * na kod próbujący zobaczyć błąd. – usr

+0

czy ten przykład kodu nie usuwa plików w podfolderach? A może chcesz usunąć pliki z głównego pliku? –

+0

To nie jest całkowicie rekurencyjne. Usunie to (teoretycznie) pliki z katalogów bezpośrednio pod katalogiem najwyższego poziomu. Czy to jest intencja? – wdavo

Odpowiedz

8

Ty można uzyskać wszystkie pliki we wszystkich podkatalogach przy użyciu SearchOption.AllDirectories

fileGenerationDir.GetFiles("*", SearchOption.AllDirectories).ToList().ForEach(file=>file.Delete()); 
0

Jeśli pliki są przechowywane w folderze TestFilesDir nie masz dostać to podkatalogi, należy po prostu:

fileGenerationDir.GetFiles().ToList().ForEach(file => file.Delete()); 

inaczej usuwasz tylko pliki podfolder w

0
private void CleanUpTempDirFiles() { 
     var fileGenerationDir = new DirectoryInfo(
      Path.Combine(Path.GetTempPath(), "TestFilesDir")); 

     fileGenerationDir.GetFiles().ToList().ForEach(file => file.Delete());    
    } 
1

to zrobi:

 string[] filePaths = Directory.GetFiles(
      Path.Combine(Path.GetTempPath(), "TestFilesDir") 
      , 
      "*", 
      SearchOption.AllDirectories); 

     foreach (var filePath in filePaths) 
      File.Delete(filePath); 
1

Używasz GetDirectories pierwszą, która zwraca wszystkie podkatalogi w katalogu temp. Dlatego nie zwraca plików w tym katalogu. Więc może chcesz to zrobić w zamian:

var tempDir = Path.Combine(Path.GetTempPath(), "TestFilesDir"); 
var allFilesToDelete = Directory.EnumerateFiles(tempDir, "*.*", SearchOption.AllDirectories); 
foreach (var file in allFilesToDelete) 
    File.Delete(file); 

Usunięto ToLists i używane SearchOption.AllDirectories który przeszukuje rekurencyjnie.

How to: Iterate Through a Directory Tree (C# Programming Guide)