介绍

在执行 Directory.Delete 删除目录时,目录内部存在过深的子目录而完整路径超过 260 个字符,删除就会出现异常。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
DirectoryNotFoundException: Could not find a part of the path "C:\Project\XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\Output\GradleProject\launcher\build\intermediates\desugar_graph\release\dexBuilderRelease\out\currentProject\jar_8644da973e7b1e319711ad5b4fbc94027d2acce4dda8b1bd6d51994cb312313d_bucket_0\graph.bin"
  at System.IO.File.Delete (System.String path) [0x00073] in <eae584ce26bc40229c1b1aa476bfa589>:0
  at System.IO.Directory.RecursiveDelete (System.String path) [0x0003f] in <eae584ce26bc40229c1b1aa476bfa589>:0
  at System.IO.Directory.RecursiveDelete (System.String path) [0x00024] in <eae584ce26bc40229c1b1aa476bfa589>:0
  at System.IO.Directory.RecursiveDelete (System.String path) [0x00024] in <eae584ce26bc40229c1b1aa476bfa589>:0
  at System.IO.Directory.RecursiveDelete (System.String path) [0x00024] in <eae584ce26bc40229c1b1aa476bfa589>:0
  at System.IO.Directory.RecursiveDelete (System.String path) [0x00024] in <eae584ce26bc40229c1b1aa476bfa589>:0
  at System.IO.Directory.RecursiveDelete (System.String path) [0x00024] in <eae584ce26bc40229c1b1aa476bfa589>:0
  at System.IO.Directory.RecursiveDelete (System.String path) [0x00024] in <eae584ce26bc40229c1b1aa476bfa589>:0
  at System.IO.Directory.RecursiveDelete (System.String path) [0x00024] in <eae584ce26bc40229c1b1aa476bfa589>:0
  at System.IO.Directory.RecursiveDelete (System.String path) [0x00024] in <eae584ce26bc40229c1b1aa476bfa589>:0
  at System.IO.Directory.RecursiveDelete (System.String path) [0x00024] in <eae584ce26bc40229c1b1aa476bfa589>:0
  at System.IO.Directory.Delete (System.String path, System.Boolean recursive) [0x00009] in <eae584ce26bc40229c1b1aa476bfa589>:0
  at Build.Export () [0x0008d] in C:\Project\XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\Build.cs:291

环境

  • Windows 10 21H2
  • Unity 2019.4.41f1

分析

虽然传入的路径没有那么长,但是在 Directory.Delete 内部会使用递归删除子目录与子文件,导致路径超过 260 个字符限制。

Windows 启用长路径支持无效,使用 \?\ 前缀无效

- 文件命名、路径和命名空间 - Win32 apps | Microsoft Learn

本质原因是因为路径过长,Unity 内置 mono 系统库版本过老,无法删除长路径。

- mono/mcs/class/referencesource/mscorlib/system/io/directory.cs at main · mono/mono · GitHub

方案

Unity 2019

推荐使用外部工具删除目录,例如 rmdir 命令。

Unity 升级

实测 Unity 2022.3.62f1 没有这个问题,相同环境下相同代码可以正常删除。

推荐旧项目尽可能升级到最新的 LTS 版本。