简体   繁体   中英

Recursive delete of files and directories in C#

How to delete a given directory recursively in C#? A directory containing files.

Should the System.IO.Directory.Delete with the second parameter true do the trick?


EDIT:

So, I actually did answer my own question, although the answers here were a little more clarifying. The reason for me asking this in the first place was that the code that has exactly that invocation of Delete (2nd param set to true ) was not doing what it was supposed to be doing. As it turned out the cause of that was that there was a file somewhere down in the the directory hierarchy with RO attribute set, and the Polish version of Windows XP was throwing a really strange message for that.

The only solution that worked for me if the subdirectories also contains files is by using a recursive function:

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

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

It appears that Directory.Delete(dir, true) only delete files of the current directory, and subdirectories if they are empty.

Hope it helps someone.

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

Yup, that's the point of that parameter. Did you try it and have any problems? (I've just double-checked, and it works fine for me.)

If you get UnauthorizedAccessException . You can use modified of RecursiveDelete from Jone Polvora . Thank you for Idea. I will use it.

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

Recursive works for both files and folders (oddly, I thought it didn't work for files; my bad...):

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

Modified solution from @StayOnTarget, so that root dir is not getting removed:

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

Why do not use?

Directory.Delete(directoryPath, true);

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM