diff --git a/aspnet-core/frameworks/src/Lion.AbpPro.Cli.Core/Lion/AbpPro/Cli/Utils/ReplaceHelper.cs b/aspnet-core/frameworks/src/Lion.AbpPro.Cli.Core/Lion/AbpPro/Cli/Utils/ReplaceHelper.cs index d8ad5b7b..d0966f17 100644 --- a/aspnet-core/frameworks/src/Lion.AbpPro.Cli.Core/Lion/AbpPro/Cli/Utils/ReplaceHelper.cs +++ b/aspnet-core/frameworks/src/Lion.AbpPro.Cli.Core/Lion/AbpPro/Cli/Utils/ReplaceHelper.cs @@ -1,4 +1,4 @@ -namespace Lion.AbpPro.Cli.Utils; +namespace Lion.AbpPro.Cli.Utils; public static class ReplaceHelper { @@ -50,26 +50,64 @@ public static class ReplaceHelper string moduleName, string version, bool vben5) + { + // 先收集所有需要重命名的目录,按深度排序(深的先处理) + var directoriesToRename = new List<(DirectoryInfo DirectoryInfo, string NewDirectoryPath)>(); + CollectDirectoriesToRename(sourcePath, oldCompanyName, oldProjectName, oldModuleName, companyName, projectName, moduleName, version, vben5, directoriesToRename); + + // 按路径深度降序排序,确保先处理深层目录,再处理父目录 + var sortedDirectories = directoriesToRename + .OrderByDescending(d => d.DirectoryInfo.FullName.Count(c => c == Path.DirectorySeparatorChar || c == Path.AltDirectorySeparatorChar)) + .ToList(); + + foreach (var (directoryInfo, newDirectoryPath) in sortedDirectories) + { + if (directoryInfo.FullName != newDirectoryPath) + { + try + { + directoryInfo.MoveTo(newDirectoryPath); + } + catch (IOException ex) + { + // 如果目录被占用,等待重试 + Thread.Sleep(100); + directoryInfo.MoveTo(newDirectoryPath); + } + } + } + } + + private static void CollectDirectoriesToRename( + string sourcePath, + string oldCompanyName, + string oldProjectName, + string oldModuleName, + string companyName, + string projectName, + string moduleName, + string version, + bool vben5, + List<(DirectoryInfo DirectoryInfo, string NewDirectoryPath)> directoriesToRename) { var directories = Directory.GetDirectories(sourcePath); foreach (var subDirectory in directories) { - RenameAllDirectories(subDirectory, oldCompanyName, oldProjectName, oldModuleName, companyName, projectName, moduleName, version, vben5); - var directoryInfo = new DirectoryInfo(subDirectory); + + // 先递归收集子目录 + CollectDirectoriesToRename(subDirectory, oldCompanyName, oldProjectName, oldModuleName, companyName, projectName, moduleName, version, vben5, directoriesToRename); + + // 检查当前目录是否需要重命名 if (directoryInfo.Name.Contains(oldCompanyName) || directoryInfo.Name.Contains(oldProjectName) || directoryInfo.Name.Contains(oldModuleName)) { var oldDirectoryName = directoryInfo.Name; var newDirectoryName = oldDirectoryName.CustomReplace(oldCompanyName, oldProjectName, oldModuleName, companyName, projectName, moduleName, version, vben5); - var newDirectoryPath = Path.Combine(directoryInfo.Parent?.FullName, newDirectoryName); - if (directoryInfo.FullName != newDirectoryPath) - { - directoryInfo.MoveTo(newDirectoryPath); - } + directoriesToRename.Add((directoryInfo, newDirectoryPath)); } } }