You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将子目录文件移至上级父目录?批量迁移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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 19:01:19