使用C#删除文件夹为空

时间:2011-11-15 21:26:03

标签: c# directory

我正在编写一个工具,允许我浏览一个相当大的目录和子目录列表。我想删除一个文件夹,如果它是空的。我可以使用以下代码删除空的文件夹和子文件夹:

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

我的问题是如何让代码通过并在每次删除后检查文件夹,因为一旦删除文件夹,它就会使父文件夹变空,然后应该删除。一旦代码找不到任何空文件夹或子文件夹,它就会退出。

5 个答案:

答案 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)

这将删除给定目录中的所有空(子)文件夹

https://stackoverflow.com/a/16688997/2408998