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

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;
}    
问题分析
  1. 第一个循环中,destinationName获取的是XBLA_Unpacked下的直接子目录(比如DirectoryName),拼接.xex后变成XBLA_Unpacked/DirectoryName.xex,导致File.Move把文件移动到根目录并改名,不符合需求。
  2. 第二个循环逻辑混乱:每次循环都重新获取000D0000目录列表,且直接用目录路径作为File.Move的目标(未拼接文件名),会触发参数错误,无法正常执行。
  3. 手动拼接路径容易出现分隔符错误,应该用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 11:35:17