C#实现四级子目录文件重命名为顶层目录名并保留原位置
问题描述
我有一个名为default.xex的文件,路径为XBLA_Unpacked/DirectoryName/Subdirectory/000D0000/default.xex。我希望将该文件重命名为DirectoryName.xex,且保留在000D0000子目录中。目前我使用File.Move()实现了重命名,但文件被移动到了XBLA_Unpacked目录下,后续尝试将其移回的代码也无法正常工作。
当前代码如下:
static void ReNamePirs() { string homePath = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile); string unpackedPath = homePath + "\\XBLA_Unpacked\\"; string reNamePath = homePath + "\\XBLA_Unpacked"; var files = GetAllFiles(unpackedPath); var folders = GetAllFolders(unpackedPath); List<string> sourceName = Directory.GetFiles(unpackedPath, "default.xex", SearchOption.AllDirectories).ToList(); List<string> destinationName = Directory.GetDirectories(unpackedPath, "*", SearchOption.TopDirectoryOnly).ToList(); List<string> finalDestination = Directory.GetDirectories(unpackedPath, "000D0000", SearchOption.AllDirectories).ToList(); for (int i = 0; i < sourceName.Count; i++) { destinationName[i] = destinationName[i] + ".xex"; File.Move(sourceName[i], destinationName[i]); } sourceName = Directory.GetFiles(reNamePath, ".xex", SearchOption.AllDirectories).ToList(); for (int i = 0; i < sourceName.Count; i++) { destinationName = Directory.GetDirectories(unpackedPath, "000D0000", SearchOption.AllDirectories).ToList(); File.Move(sourceName[i], destinationName[i]); } return; }
问题分析
- 第一个循环中,
destinationName获取的是XBLA_Unpacked下的直接子目录(比如DirectoryName),拼接.xex后变成XBLA_Unpacked/DirectoryName.xex,导致File.Move把文件移动到根目录并改名,不符合需求。 - 第二个循环逻辑混乱:每次循环都重新获取
000D0000目录列表,且直接用目录路径作为File.Move的目标(未拼接文件名),会触发参数错误,无法正常执行。 - 手动拼接路径容易出现分隔符错误,应该用
Path.Combine处理路径。
解决方案
正确思路是:对每个找到的default.xex,直接在其所在的000D0000目录下重命名为DirectoryName.xex,无需移动文件位置。
修改后的代码如下:
static void ReNamePirs() { string homePath = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile); string unpackedPath = Path.Combine(homePath, "XBLA_Unpacked"); // 遍历所有子目录下的default.xex文件 foreach (string sourceFile in Directory.GetFiles(unpackedPath, "default.xex", SearchOption.AllDirectories)) { // 获取当前文件所在的目录(即000D0000目录) string targetDir = Path.GetDirectoryName(sourceFile); // 向上遍历目录结构,找到XBLA_Unpacked下的直接子目录(DirectoryName) DirectoryInfo currentDirInfo = new DirectoryInfo(targetDir); string targetFileName = null; while (currentDirInfo.Parent != null && currentDirInfo.Parent.FullName != unpackedPath) { currentDirInfo = currentDirInfo.Parent; } // 确认找到目标目录名 if (currentDirInfo.Parent != null && currentDirInfo.Parent.FullName == unpackedPath) { targetFileName = $"{currentDirInfo.Name}.xex"; } if (string.IsNullOrEmpty(targetFileName)) { // 找不到对应的DirectoryName,跳过该文件 continue; } // 构造目标文件路径:000D0000目录下的DirectoryName.xex string targetPath = Path.Combine(targetDir, targetFileName); // 执行重命名(同一目录下的Move操作即为重命名) File.Move(sourceFile, targetPath); } }
代码要点说明
- 使用
Path.Combine拼接路径,避免手动拼接带来的分隔符错误和跨平台问题。 - 通过
DirectoryInfo向上遍历目录结构,精准定位到XBLA_Unpacked下的直接子目录名(即DirectoryName)。 - 直接在原文件所在的
000D0000目录下构造目标路径,确保文件位置不变,仅修改文件名。 - 增加了异常判断逻辑,避免因目录结构不符合预期导致的错误。
内容的提问来源于stack exchange,提问作者cmclark00
相关产品推荐
相关产品推荐

