我正在编写一个工具,允许我浏览一个相当大的目录和子目录列表。我想删除一个文件夹,如果它是空的。我可以使用以下代码删除空的文件夹和子文件夹:
string dir = textBox1.Text;
string[] folders = System.IO.Directory.GetDirectories(dir, "*.*", System.IO.SearchOption.AllDirectories);
foreach (var directory in folders)
{
if (System.IO.Directory.GetFiles(directory).Length == 0 && System.IO.Directory.GetDirectories(directory).Length == 0)
{
System.IO.StreamWriter Dfile = new System.IO.StreamWriter(newpath, true);
System.IO.Directory.Delete(directory);
}
}
我的问题是如何让代码通过并在每次删除后检查文件夹,因为一旦删除文件夹,它就会使父文件夹变空,然后应该删除。一旦代码找不到任何空文件夹或子文件夹,它就会退出。
答案 0 :(得分:7)
编写深度优先递归函数。在完成每个递归调用时,请检查当前文件夹以查看它是否为空。如果是,则删除它。
像这样(伪代码)
DeleteEmptyFolders(path)
{
foreach Folder f in Path
{
DeleteEmptyFolders(f);
if (f is empty)
{
Delete(f);
}
}
}
答案 1 :(得分:1)
你可以像这样递归(未经测试):
void DeleteFolder(string folder) {
string[] folders = System.IO.Directory.GetDirectories(folder, "*.*", System.IO.SearchOption.AllDirectories);
foreach (var directory in folders)
{
DeleteFolder(directory);
}
//delete this folder if empty
}
答案 2 :(得分:0)
这是一个想法(未经测试)
while ( true )
{
DirectoryInfo parent = Directory.GetParent(current.FullName);
if ( parent.GetFiles().Length == 0 && parent.GetDirectories().Length == 0 )
{
current = parent;
current.Delete();
}
else
{
break;
}
}
这会遍历当前目录的树以删除任何空目录。
答案 3 :(得分:0)
看起来你正试图删除任何不包含文件的文件夹。我相信这会为你做到这一点。我用一个小的文件夹集进行了测试,这个文件夹设置为5级深度,并且在几个位置都有一个文件。所有没有文件的文件夹都被删除了。所有文件都保持不变。小调整到一个片段发现...谢谢马特史密斯。 Cannot delete directory with Directory.Delete(path, true)
string[] dirs = System.IO.Directory.GetDirectories(Directory.GetCurrentDirectory(), "*.*",SearchOption.AllDirectories);
foreach (string d in dirs)
{
if (System.IO.Directory.Exists(d)) {
if (System.IO.Directory.GetFiles(d, "*.*", SearchOption.AllDirectories).Length == 0)
{
DeleteDirectory(d);
}
}
}
public static void DeleteDirectory(string target_dir)
{
string[] dirs = Directory.GetDirectories(target_dir);
foreach (string dir in dirs)
{
DeleteDirectory(dir);
}
Directory.Delete(target_dir, false);
}
答案 4 :(得分:-1)
这将删除给定目录中的所有空(子)文件夹