C#中递归删除文件和目录

27
如何在C#中递归删除给定目录?该目录包含文件。

使用带有第二个参数trueSystem.IO.Directory.Delete是否能达到目的?


编辑:

实际上,我自己回答了我的问题,尽管这里的答案更加明确。我之所以首先提出这个问题是因为具有正好这个调用Delete(第二个参数设置为true)的代码未执行它应该执行的操作。事实证明,造成这种情况的原因是,在目录层次结构的某个地方有一个具有RO属性的文件,并且波兰语版本的Windows XP对此会抛出一个非常奇怪的消息。


1
我认为你已经自己给出了答案 :-) - Jakob Christensen
这似乎是一个奇怪的问题。提问者已经知道第二个参数,它是一个名为“recursive”的布尔值。你基本上是在说“我如何进行递归?我将递归设置为true吗?” - joshcomley
好的,也许编辑说明了一些问题。该目录包含一些文件... - Bartosz Radaczyński
1
我可以肯定地说,这种方法最多也只能算是不可靠的。我正在尝试在 UNC 路径上进行递归删除,即使我确保所有文件(而非目录)都已经被提前删除,但这种方法仍然失败了。我可以确定那些文件夹是空的,因为它们是我两秒钟前创建的。这里没有只读文件的情况。 - dyslexicanaboko
6个回答

34

如果子目录中也包含文件,那么对我有效的唯一解决方案是使用递归功能:

    public static void RecursiveDelete(DirectoryInfo baseDir)
    {
        if (!baseDir.Exists)
            return;

        foreach (var dir in baseDir.EnumerateDirectories())
        {
            RecursiveDelete(dir);
        }
        baseDir.Delete(true);
    }

看起来Directory.Delete(dir,true)仅删除当前目录的文件以及子目录(如果它们为空)。

希望对某些人有所帮助。

顺便说一下,示例:RecursiveDelete(new DirectoryInfo(@"C:\my_dir"));


有趣的是,这对我不起作用,因为“baseDir.Delete”试图删除不存在的文件夹。 - Matthias Müller

18

是的,这就是该参数的作用。你尝试过它了吗?有遇到什么问题吗?(我刚刚再次检查了一遍,对我来说一切都正常运行。)


4
确保路径中没有只读文件/目录是值得做的,这会在一段时间前给我带来一些问题。 - Pondidum
没错,就是这个。谢谢你的提示 :D - Bartosz Radaczyński
2
对我来说不起作用,如果子目录中也包含文件。 - Jone Polvora
@Jone:发生了什么?也许值得提出一个新问题。 - Jon Skeet

11

如果您遇到 UnauthorizedAccessException 异常,您可以使用修改后的 RecursiveDelete 函数,来源于 Jone Polvora。感谢提供的思路。我会使用它。

    public static void RecursiveDelete(DirectoryInfo baseDir)
    {
        if (!baseDir.Exists)
            return;

        foreach (var dir in baseDir.EnumerateDirectories())
        {
            RecursiveDelete(dir);
        }
        var files = baseDir.GetFiles();
        foreach (var file in files)
        {
            file.IsReadOnly = false;
            file.Delete();
        }
        baseDir.Delete();
    }

6

递归可用于文件和文件夹(奇怪的是,我以为它对文件不起作用; 我错了...):

// create some nested folders...
Directory.CreateDirectory(@"c:\foo");
Directory.CreateDirectory(@"c:\foo\bar");
// ...with files...
File.WriteAllText(@"c:\foo\blap.txt", "blup");
File.WriteAllText(@"c:\foo\bar\blip.txt", "blop");
// ...and delete them
Directory.Delete(@"c:\foo", true); // fine

我不明白-第二个参数的必要性在哪里? Directory.Delete(@“C:\ foo”)肯定会删除foo及其中所有内容-如何在不删除其中所有内容的情况下删除目录? - Matt Arnold
1
@MattArnold 可以将其视为更多的“我期望它是空的,所以如果不是:那就是个问题,请失败”与“无论如何都要烧掉它”的区别。 - Marc Gravell

0

修改了@StayOnTarget的解决方案,以便不删除根目录:

public static void RecursiveDelete(DirectoryInfo baseDir, bool isRootDir)
{
    if (!baseDir.Exists)
        return;
    foreach (var dir in baseDir.EnumerateDirectories()) RecursiveDelete(dir, false);
    foreach (var file in baseDir.GetFiles())
    {
        file.IsReadOnly = false;
        file.Delete();
    }
    if (!isRootDir) baseDir.Delete();
}

-1

这就是他正在使用的,不是他在问题的第一行提到的吗? - DaveyDaveDave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接