【问题标题】:Delete all empty directories in specified path删除指定路径中的所有空目录
【发布时间】:2014-03-20 00:01:01
【问题描述】:

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

示例: C:\MyProject\Project1\file1\file2\file3\file4\file5\document.txt

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

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

有没有人为此写过东西?

基本上,我可以在其中指定要从树中删除的路径(下面的第一个 arg)以及树的根(第二个 arg)。

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

另一种看待它的方式是 Directory.CreateDirectory 的逆。这是我用来生成这些长分支的函数。现在我需要在完成后移除它们,而不会打扰其他任何东西。

【问题讨论】:

  • @NielW 确保在@DeveloperGuo 链接的问题的cmets 中使用EnumerateFileSystemEntries 建议。
  • 就是这样。我实际上是先看那里的。这种方法的问题是它是自上而下的,并且会删除不在我要删除的路径中的其他空目录。

标签: c#


【解决方案1】:

一点点迭代就可以了:

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

从感兴趣的目录开始;只要没有文件并且您尚未到达“根”,请将其删除并移至其父目录。重复直到完成。

【讨论】:

  • 这很好,但是如果目录中有任何子文件夹被删除,它就会抛出。我在 while 子句中添加了“ && !di.EnumerateDirectories().Any()”,效果很好。我建议更新您的答案,以便我可以选择它。
  • @NielW:嗯,我以为你总是从叶目录开始。好的,要更新了。
  • 我是,但有些父母还有其他孩子。当我说“正在删除的目录”时,我指的是您的“di”。
【解决方案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) ;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-08
    • 1970-01-01
    • 1970-01-01
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    • 2017-05-13
    相关资源
    最近更新 更多