dotnet/runtime

Directory.Delete(string, bool) throws StackOverflowException

Open

#84,344 opened on Apr 5, 2023

View on GitHub
 (16 comments) (0 reactions) (1 assignee)C# (5,445 forks)batch import
area-System.IOhelp wantedin-pr

Repository metrics

Stars
 (17,886 stars)
PR merge metrics
 (Avg merge 12d 11h) (661 merged PRs in 30d)

Description

Description

Directory.Delete(string, bool) throws a StackOverflowException if the nesting depth of subdirectories is huge (in my case 14000).

Reproduction Steps

  • Create nested subdirectories like below:
    DirectoryInfo topMost = new DirectoryInfo("C:\\temp");
    int depth = 14000;

    DirectoryInfo subDir = topMost;
    for (int i = 0; i < depth; i++)
    {
        subDir = subDir.CreateSubdirectory("a");
    }
  • Then try to delete the top most directory
Directory.Delete(topMost.FullName, true);

Expected behavior

Topmost directory and its all subdirectories are deleted successfully.

Actual behavior

A StackOverflowException is thrown with the following stacktrace:

Stack overflow.
   at System.String.Concat(System.ReadOnlySpan`1<Char>, System.ReadOnlySpan`1<Char>, System.ReadOnlySpan`1<Char>)
   at System.IO.Path.JoinInternal(System.ReadOnlySpan`1<Char>, System.ReadOnlySpan`1<Char>)
   at System.IO.Path.CombineInternal(System.String, System.String)
   at System.IO.Path.Combine(System.String, System.String)
   at System.IO.FileSystem.RemoveDirectoryRecursive(System.String, WIN32_FIND_DATA ByRef, Boolean)
   at System.IO.FileSystem.RemoveDirectoryRecursive(System.String, WIN32_FIND_DATA ByRef, Boolean)
   at System.IO.FileSystem.RemoveDirectoryRecursive(System.String, WIN32_FIND_DATA ByRef, Boolean)
   at System.IO.FileSystem.RemoveDirectoryRecursive(System.String, WIN32_FIND_DATA ByRef, Boolean)
   at System.IO.FileSystem.RemoveDirectoryRecursive(System.String, WIN32_FIND_DATA ByRef, Boolean)
   at System.IO.FileSystem.RemoveDirectoryRecursive(System.String, WIN32_FIND_DATA ByRef, Boolean)
   at System.IO.FileSystem.RemoveDirectoryRecursive(System.String, WIN32_FIND_DATA ByRef, Boolean)
   at System.IO.FileSystem.RemoveDirectoryRecursive(System.String, WIN32_FIND_DATA ByRef, Boolean)
   at System.IO.FileSystem.RemoveDirectoryRecursive(System.String, WIN32_FIND_DATA ByRef, Boolean)
   at System.IO.FileSystem.RemoveDirectoryRecursive(System.String, WIN32_FIND_DATA ByRef, Boolean)
   at System.IO.FileSystem.RemoveDirectoryRecursive(System.String, WIN32_FIND_DATA ByRef, Boolean)
   at System.IO.FileSystem.RemoveDirectoryRecursive(System.String, WIN32_FIND_DATA ByRef, Boolean)
   at System.IO.FileSystem.RemoveDirectoryRecursive(System.String, WIN32_FIND_DATA ByRef, Boolean)
   at System.IO.FileSystem.RemoveDirectoryRecursive(System.String, WIN32_FIND_DATA ByRef, Boolean)
   ....
   ....

Regression?

No response

Known Workarounds

No response

Configuration

dotnet version: 6.0.301

operating system: Windows 10 version 21H2

Other information

No response

Contributor guide