C#如何将指定目录下的所有子文件夹移动到目标文件夹?
问题分析与解决方案
错误原因
- 误包含目标文件夹:
Directory.GetDirectories(selectedDrive)会返回所选驱动器下的所有子目录,其中包含你刚创建的Encrypted文件夹。当循环到这个文件夹时,源目录和目标目录完全一致,触发System.IO.IOException: 无法完成操作,因为源目录和目标目录相同的错误。 - 路径拼接逻辑错误:
moveTo + Folder会生成类似D:\EncryptedD:\TestFolder的无效路径,导致判断目录是否存在的逻辑完全失效。 - 操作类型不符:你需要的是移动文件夹,但代码中使用的
CopyDirectory是复制操作,而非移动。
修正后的代码
string selectedDrive = comboBox1.SelectedItem.ToString(); // 用Path.Combine确保路径格式正确,避免手动拼接反斜杠出错 string encryptedFolderPath = Path.Combine(selectedDrive, "Encrypted"); Directory.CreateDirectory(encryptedFolderPath); // 获取所选驱动器下的所有子目录,排除Encrypted文件夹本身 string[] allFolders = Directory.GetDirectories(selectedDrive) .Where(dir => !dir.Equals(encryptedFolderPath, StringComparison.OrdinalIgnoreCase)) .ToArray(); foreach (string sourceFolder in allFolders) { // 提取源文件夹的名称,拼接到Encrypted目录下作为目标路径 string folderName = Path.GetFileName(sourceFolder); string targetFolderPath = Path.Combine(encryptedFolderPath, folderName); // 目标路径不存在时执行移动 if (!Directory.Exists(targetFolderPath)) { Directory.Move(sourceFolder, targetFolderPath); } }
关键改进点
- 使用
Path.Combine拼接路径,彻底避免手动拼接反斜杠导致的格式错误。 - 过滤掉
Encrypted文件夹,从根源上解决源目标路径重复的问题。 - 改用
Directory.Move实现真正的文件夹移动(如果需要保留源文件夹备份,可先调用FileSystem.CopyDirectory,再用Directory.Delete(sourceFolder, true)删除源)。 - 正确提取源文件夹名称,生成合法的目标路径。
内容的提问来源于stack exchange,提问作者HQ220
相关产品推荐
相关产品推荐

