2011-11-15 25 views
3

我正在寫一個工具,將允許我去通過一個相當大的目錄和子目錄列表。我希望它刪除一個文件夾,如果它是空的。我可以刪除文件夾和空與此代碼子文件夾:刪除文件夾,如果它是空的使用C#

string dir = textBox1.Text; 
string[] folders = System.IO.Directory.GetDirectories(dir, "*.*", System.IO.SearchOption.AllDirectories); 
foreach (var directory in folders) 
{ 
    if (System.IO.Directory.GetFiles(directory).Length == 0 && System.IO.Directory.GetDirectories(directory).Length == 0) 
    { 
     System.IO.StreamWriter Dfile = new System.IO.StreamWriter(newpath, true); 
     System.IO.Directory.Delete(directory); 
    } 
} 

我的問題是如何讓代碼去,雖然和檢查後,每刪除,因爲該文件夾一旦刪除文件夾,它可以使父文件夾空的,然後應該刪除。一旦代碼找不到任何空的文件夾或子文件夾,它就會退出。

回答

7

編寫深度優先遞歸函數。在完成每次遞歸調用時,請檢查當前文件夾以查看它是否爲空。如果是,則刪除它。

是這樣的(僞)

DeleteEmptyFolders(path) 
{ 
    foreach Folder f in Path 
    { 
    DeleteEmptyFolders(f); 

    if (f is empty) 
    { 
     Delete(f); 
    } 
    } 
} 
1

你可以這樣做遞歸這樣的(未測試):

void DeleteFolder(string folder) { 
    string[] folders = System.IO.Directory.GetDirectories(folder, "*.*", System.IO.SearchOption.AllDirectories); 
    foreach (var directory in folders) 
    { 
     DeleteFolder(directory); 
    } 

    //delete this folder if empty 
} 
0

這裏有一個想法(這是未測試)

  while (true) 
      { 
       DirectoryInfo parent = Directory.GetParent(current.FullName); 
       if (parent.GetFiles().Length == 0 && parent.GetDirectories().Length == 0) 
       { 
        current = parent; 
        current.Delete(); 
       } 
       else 
       { 
        break; 
       } 

      } 

這會沿着當前目錄的樹移除任何空的父目錄。

0

從它的外觀你試圖刪除任何不包含文件的文件夾。我相信這會對你有用。我測試了一個5層深的小文件夾集合,並在幾個位置放置了一個文件。所有沒有文件的文件夾都被刪除。所有文件保持不變。小小的調整發現一個片段...感謝馬特史密斯。 Cannot delete directory with Directory.Delete(path, true)

string[] dirs = System.IO.Directory.GetDirectories(Directory.GetCurrentDirectory(), "*.*",SearchOption.AllDirectories); 
      foreach (string d in dirs) 
      { 
       if (System.IO.Directory.Exists(d)) { 
        if (System.IO.Directory.GetFiles(d, "*.*", SearchOption.AllDirectories).Length == 0) 
        { 
         DeleteDirectory(d); 
        } 
       } 
      } 

    public static void DeleteDirectory(string target_dir) 
    { 
     string[] dirs = Directory.GetDirectories(target_dir); 

     foreach (string dir in dirs) 
     { 
      DeleteDirectory(dir); 
     } 

     Directory.Delete(target_dir, false); 
    }