如何将子目录文件移至上级父目录?批量迁移XBLA游戏目录文件求助
批量移动XBLA游戏目录文件的解决方案
问题描述
需要批量将/XBLA/<gameName>/<gameID>/000D0000/下的所有文件和子目录移动到/XBLA/<gameName>/,处理/XBLA/下所有不同的gameName目录。
现有代码问题分析
你提供的代码存在几个关键错误:
- 误用
Directory.GetFiles获取目录路径(000D0000是目录),应使用Directory.GetDirectories destinationDirectory用GetFiles获取顶层目录,逻辑错误且未对应到每个gameName的目标路径- 循环中错误调用
gameFiles.ToString()和destinationDirectory.ToString(),输出的是列表类型字符串而非实际路径 - 未区分文件与目录的移动逻辑,直接用
File.Move处理目录会触发异常
修正后的代码
static void MoveXBLAFiles() { string homePath = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile); string xblaRoot = Path.Combine(homePath, "XBLA"); // 获取所有gameName目录 string[] gameDirectories = Directory.GetDirectories(xblaRoot); foreach (string gameDir in gameDirectories) { // 查找当前gameName下所有000D0000目录(递归搜索) string[] sourceDirs = Directory.GetDirectories(gameDir, "000D0000", SearchOption.AllDirectories); foreach (string sourceDir in sourceDirs) { // 目标路径为当前gameName目录 string targetDir = gameDir; // 获取源目录下的所有文件和子目录 string[] files = Directory.GetFiles(sourceDir, "*", SearchOption.AllDirectories); string[] subDirs = Directory.GetDirectories(sourceDir, "*", SearchOption.AllDirectories); // 移动文件 foreach (string file in files) { // 计算文件在目标目录中的相对路径 string relativePath = Path.GetRelativePath(sourceDir, file); string targetFilePath = Path.Combine(targetDir, relativePath); // 创建目标父目录(如果不存在) Directory.CreateDirectory(Path.GetDirectoryName(targetFilePath)); // 移动文件,支持覆盖已存在文件 File.Move(file, targetFilePath, true); } // 移动子目录 foreach (string subDir in subDirs) { string relativePath = Path.GetRelativePath(sourceDir, subDir); string targetSubDirPath = Path.Combine(targetDir, relativePath); // 目标目录不存在时才移动,避免冲突 if (!Directory.Exists(targetSubDirPath)) { Directory.Move(subDir, targetSubDirPath); } } // 可选:删除空的000D0000源目录 if (Directory.GetFiles(sourceDir).Length == 0 && Directory.GetDirectories(sourceDir).Length == 0) { Directory.Delete(sourceDir); } } } }
代码说明
- 用
Path.Combine拼接路径,避免手动拼接导致的分隔符错误 - 递归定位每个
gameName下的000D0000目录 - 保留原文件的相对目录结构,确保文件移动到正确子路径
- 支持覆盖已存在文件(无需覆盖可移除
File.Move的第三个参数true) - 可选清理空的
000D0000目录,减少冗余文件夹
内容的提问来源于stack exchange,提问作者cmclark00
相关产品推荐
相关产品推荐

