dotnet/runtime

Directory.Delete(string, bool) throws StackOverflowException

Open

#84.344 aberto em 5 de abr. de 2023

Ver no GitHub
 (16 comments) (0 reactions) (1 assignee)C# (5.445 forks)batch import
area-System.IOhelp wantedin-pr

Métricas do repositório

Stars
 (17.886 stars)
Métricas de merge de PR
 (Mesclagem média 12d 11h) (661 fundiu PRs em 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

Guia do colaborador