删除指定路径中的所有空目录

时间:2014-03-20 00:01:01

标签: c#

在我的程序中,我创建了一个长目录分支树。当我完成了这棵树的叶子上的某些文件时,我删除了它们,但我最终得到了很多空的父目录。我也想删除它们。但是,我不能递归删除所有这些父目录,因为其中一些目录中还有一些我无法删除的子目录。

实施例: C:\ MyProject的\ PROJECT1 \文件1 \文件2 \ file3的\ file4将\ file5 \ document.txt的

如果我删除document.txt,我还想删除路径中的所有其他空文件夹。但是,文件3中有一些东西(除了file4),所以我不能删除它或它上面的任何东西。所以在这种情况下,将删除file4和file5。

将根目录视为Project1。我不想删除上面的任何内容。

有没有人写过这样的话?

基本上,我可以调用的地方,我可以指定我试图从树中删除的路径(下面的第一个arg),以及树的根(第二个arg)。

DeleteEmptySubDirectoriesInPath("C:\MyProject\Project1\file1\file2\file3\file4\file5\",
"C:\MyProject\Project1");

另一种查看它的方法是Directory.CreateDirectory的反转。这是我用来生成这些长分支的函数。现在我需要在没有打扰其他任何事情的情况下删除它们。

2 个答案:

答案 0 :(得分:6)

一点点迭代就可以了:

var di = new DirectoryInfo(@"C:\MyProject\Project1\file1\file2\file3\file4\");
var root = @"C:\MyProject\Project1"; // no trailing slash!
while (di.FullName != root 
       && !di.EnumerateFiles().Any() 
       && !di.EnumerateDirectories().Any())
{
    di.Delete();
    di = di.Parent;
}

从感兴趣的目录开始;只要没有文件并且您没有到达" root",删除它并移动到其父目录。重复直到完成。

答案 1 :(得分:2)

似乎不应该比这更难:

  • 我们删除文件
  • 走上目录树,删除[empty]目录,直到我们到达根目录。

以下是代码:

static void DeleteAndPrune(string path)
{
  FileInfo fi = new FileInfo(path);
  fi.Delete();

  // the loop ends with the first non-empty directory, or the root.
  // - if the directoryInfo itself is null, the file was deleted *from* the root,
  //   so there's nothing to do.
  // - if the directoryInfo's parent is null, we've hit the root directory
  // Easy!      
  for ( DirectoryInfo di = fi.Directory ; di != null && di.Parent != null && !di.EnumerateFileSystemInfos().Any() ; di = di.Parent )
  {
    di.Delete() ;
  }

  return;
}

如果您想要遍历整个树并整理它以删除空目录,这几乎更简单。只是一个简单的递归树步行:

    static void Tidy( DirectoryInfo tree )
    {
        foreach (DirectoryInfo di in tree.EnumerateDirectories())
        {
            Tidy(di);
        }
        tree.Refresh();
        if (!tree.EnumerateFileSystemInfos().Any())
        {
            tree.Delete();
        }
        return;
    }

可以这样做:

DirectoryInfo root = new DirectoryInfo( @"C:\MyProject\Project1" ) ;
Tidy(root) ;