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

时间:2009-05-29 09:40:08

标签: c#

如何在C#中递归删除给定的dir?具有第二个参数true的System.IO.Directory.Delete是否应该执行该操作?

编辑:我的意思是一个包含文件的目录:D抱歉误入歧途。

EDIT2:所以,我确实回答了我自己的问题,尽管这里的答案更加清晰。我首先要问的原因是,完全调用Delete(第二个参数设置为true)的代码没有按照预期的那样进行。事实证明,原因是目录层次结构中有一个文件设置了RO属性,并且波兰语版本的Windows XP为此抛出了一个非常奇怪的消息。

5 个答案:

答案 0 :(得分:19)

如果子目录还包含文件,那么对我有用的唯一解决方案是使用递归函数:

    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)只删除当前目录和子目录(如果它们为空)的文件。

希望它有所帮助。

btw,例如:RecursiveDelete( new DirectoryInfo(@"C:\my_dir") );

答案 1 :(得分:11)

是的,这就是那个参数的重点。你有没有尝试过并有任何问题? (我只是仔细检查过,对我来说效果很好。)

答案 2 :(得分:4)

文件和文件夹的递归工作(奇怪的是,我认为它对文件不起作用;我的不好......):

// 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

答案 3 :(得分:2)

如果您收到UnauthorizedAccessException。 您可以使用 Jone Polvora 中的 RecursiveDelete 进行修改。谢谢你的想法。我会用它。

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

答案 4 :(得分:1)

为什么不使用?

Directory.Delete(directoryPath,true);

https://msdn.microsoft.com/en-us/library/fxeahc5f(v=vs.110).aspx