递归删除空文件夹,直到在dir-tree中找不到空目录

时间:2014-03-21 22:54:49

标签: c# recursion

我有一个基于GUID构建图像文件夹的大量图像的架构:

  

C:\ AdPictures \ 7E \ 42 \ 1A \ DC-7 \ 3B \ 7- \ 4E \ C2-9 \ EE \ F- \ F2 \ 4C \ 7D \ 4A \ 32 \ 14 \

我需要进行递归删除,直到文件夹从文件夹“14”到目录“7e”不为空(“AdPictures”文件夹需要保留,因为它是根目录。)

我找到了:

Directory.Delete(folderPath, true); 

但在使用时会删除所有内容。

如何实现一个方法,从底部开始删除所有空目录,并在找到树后的非空目录后停止?

我的解决方案应该使用递归。

5 个答案:

答案 0 :(得分:3)

这是递归方法。

DirectoryInfo dir = new DirectoryInfo(folderPath);
DeleteFolderIfEmpty(dir);


public void DeleteFolderIfEmpty(DirectoryInfo dir){
   if(dir.EnumerateFiles().Any() || dir.EnumerateDirectories().Any())
        return;
   DirectoryInfo parent = dir.Parent;
   dir.Delete();

   // Climb up to the parent
   DeleteFolderIfEmpty(parent);
}

防止删除Root

DirectoryInfo dir = new DirectoryInfo(folderPath);
DeleteFolderIfEmpty(dir);


public void DeleteFolderIfEmpty(DirectoryInfo dir){
   if(dir.EnumerateFiles().Any() || dir.EnumerateDirectories().Any())
        return;

   if(dir.FullName == @"c:\folder\root")
        return;

   DirectoryInfo parent = dir.Parent;
   dir.Delete();

   // Climb up to the parent
   DeleteFolderIfEmpty(parent);
}

答案 1 :(得分:1)

getdirectories msdn

基本的递归模型。

void checkDIR(string Path)
{
//Path will equal AddImage right? 
   foreach(string childpath in Directory.GetDirectories(path))
    {
         //so here we are calling checkpaths for 7E GUID Directory Structure
         checkpaths(childpath);

    }
}

void checkpaths(string Path)
{



   foreach(string childpath in Directory.GetDirectories(path))
    {  //here we dig deeper
         checkpaths(childpaths);//recursion


    }
    //the first recursion to get here will be the deepest directory
   //we are now in '14'

   if(there are any files)
   {do what you want}
   else
   {
    do what you need
   }

}

你可能需要一些标志或其他计数器和变量来测试和跟踪事物,但这正是你要找的东西。只要您在checkpaths addimage中呼叫删除,就不会被删除

答案 2 :(得分:0)

您可以使用DirectoryInfo.Delete()DirectoryInfo.Parent property。使用递归的可能解决方案可能如下所示:

private void deleteEmptyDirectories(String path)
{
    var di = new DirectoryInfo(path);
    // if directory is empty
    if (di.GetFiles().Count() == 0 && di.GetDirectories().Count() == 0)
    {
        di.Delete(); // it
        // and go one up
        deleteEmptyDirectories(di.Parent.FullName);
    }
    // else stop (recursion) here
}

该功能可以这样使用:

var start = @"c:\path\to\sub\directory\";
deleteEmptyDirectories(start);

答案 3 :(得分:0)

试试这个:

var dir = "a/b/c/d";
white (true) {
    If (Directory.EnumerateFiles(dir).Any() || 
        Directory.EnumerateDirectories(dir).Any()) break;

    Directory.Delete(dir);

    dir = Path.GetDirectoryName(dir);
 }

如果我理解你的问题,那么这将删除所有文件夹úntil找到一个不为空。

修改

只需更改为:

var dir = "a/b/c/d";
white (!Directory.EnumerateFiles(dir).Any() && 
       !Directory.EnumerateDirectories(dir).Any()) {
    Directory.Delete(dir);

    dir = Path.GetDirectoryName(dir);
 }

答案 4 :(得分:0)

请尝试以下代码示例 它用于删除指定父文件夹的所有空子文件夹,并包含两个方法:

  1. 第一种方法RemoveEmptyFolders只列出了a的子文件夹 指定文件夹并为每个文件调用第二种方法。
  2. 调用第二个RemoveEmptySubFolders 递归地检查特定子文件夹的树是否为空 并删除它,如果是这样。
  3. 代码:

    private void RemoveEmptyFolders(string path)
    {
        foreach (string subFolder in Directory.GetDirectories(path))
            RemoveEmptySubFolders(subFolder);
    }
    
    private bool RemoveEmptySubFolders(string path)
    {
        bool isEmpty = Directory.GetDirectories(path).Aggregate(true, (current, subFolder) => current & RemoveEmptySubFolders(subFolder))
            && Directory.GetFiles(path).Length == 0;
        if (isEmpty)
            Directory.Delete(path);
        return isEmpty;
    }
    

    用法:

    RemoveEmptyFolders(@"C:\AdPictures");
    

    但是,如果您需要删除以' 14'结尾的特定子树,则不需要递归,所有其他答案都符合您的需求。