在我的程序中,我创建了一个长目录分支树。当我完成了这棵树的叶子上的某些文件时,我删除了它们,但我最终得到了很多空的父目录。我也想删除它们。但是,我不能递归删除所有这些父目录,因为其中一些目录中还有一些我无法删除的子目录。
实施例: 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的反转。这是我用来生成这些长分支的函数。现在我需要在没有打扰其他任何事情的情况下删除它们。
答案 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)
似乎不应该比这更难:
以下是代码:
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) ;