我有一个基于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);
但在使用时会删除所有内容。
如何实现一个方法,从底部开始删除所有空目录,并在找到树后的非空目录后停止?
我的解决方案应该使用递归。
答案 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)
基本的递归模型。
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)
请尝试以下代码示例 它用于删除指定父文件夹的所有空子文件夹,并包含两个方法:
RemoveEmptyFolders
只列出了a的子文件夹
指定文件夹并为每个文件调用第二种方法。 RemoveEmptySubFolders
递归地检查特定子文件夹的树是否为空
并删除它,如果是这样。 代码:
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'结尾的特定子树,则不需要递归,所有其他答案都符合您的需求。