求助:将未知及错误路径文件夹移至指定目录的C#脚本问题
搞定你的文件夹移动脚本问题!
嘿,我帮你找出问题所在了!你的脚本之所以会出现“文件夹被删除却没正确移动”的情况,核心是移动路径的逻辑搞错了,导致文件夹被合并覆盖而不是保留原结构转移。
问题到底出在哪?
你现在调用的FileSystem.MoveDirectory(path, destDirname, true)逻辑有问题:
- 第一次运行时,如果
D:\confiscated不存在,它会直接把第一个源文件夹(比如桌面的TestFolder)重命名为D:\confiscated——这时候原TestFolder自然就消失了。 - 后面再移动其他文件夹时,
D:\confiscated已经存在,加上第三个参数true(允许覆盖),程序会把后续文件夹的内容合并到D:\confiscated里,然后删掉原来的源文件夹。这就是你看到“文件夹被删除”的真相:内容其实被合并了,但原文件夹的结构没保留下来。
修复后的代码
我们要做的很简单:给每个源文件夹构建专属的目标路径,让它们作为子目录存到D:\confiscated下面,同时先确保目标根目录存在。另外你原代码里类名多打了一个m(Programm→Program),顺手帮你修正了:
using System; using System.IO; using Microsoft.VisualBasic.FileIO; namespace ConsoleApp1 { public class Program { public static void Main() { string root = @"C:\Users\user1\Desktop"; string[] subdirectoryEntries = Directory.GetDirectories(root); string destRootDir = @"D:\confiscated"; // 先确保目标根目录存在,不存在就创建 if (!Directory.Exists(destRootDir)) { Directory.CreateDirectory(destRootDir); } foreach (string sourceDir in subdirectoryEntries) { // 拼接目标路径:目标根目录 + 原文件夹的名字 string targetDir = Path.Combine(destRootDir, Path.GetFileName(sourceDir)); // 移动文件夹,保留原名称,已存在则覆盖 FileSystem.MoveDirectory(sourceDir, targetDir, true); // 加个日志方便跟踪进度 Console.WriteLine($"已完成移动:{sourceDir} → {targetDir}"); } } } }
额外小提示
- 如果不想覆盖已存在的目标文件夹,把
MoveDirectory的第三个参数改成false就行,不过这时候如果目标子目录已经存在会抛异常,你可以根据需求加个try-catch处理。 - 建议保留
Console.WriteLine这类日志输出,方便你确认每个文件夹的移动状态,排查问题也更方便。
内容的提问来源于stack exchange,提问作者RainCloud
相关产品推荐
相关产品推荐

