如何利用GetFiles实现跨文件夹共存文件判断与复制操作
解决START与END文件夹文件匹配并复制的问题
嘿,我来帮你搞定这个文件匹配复制的逻辑!你的代码已经成功获取了两个文件夹的文件路径列表,接下来只需要处理文件名匹配和文件复制这两步就行,我给你一步步拆解:
核心思路
- 从两个文件夹的全路径列表中提取纯文件名(因为全路径肯定不同,我们要对比的是文件本身)
- 把END文件夹的文件名存入哈希集合,这样查找效率会很高(尤其是文件数量多的时候)
- 遍历START文件夹的每个文件,检查文件名是否存在于END的集合中,存在则执行复制操作
完整代码实现
using System; using System.IO; using System.Collections.Generic; class FileCopyMatcher { static void Main() { var USERNAME = Environment.UserName; // 用Path.Combine优化路径拼接,避免手动拼接的转义错误 string START_DIRECTORY = Path.Combine(@"C:\Users", USERNAME, "Desktop", "START"); string END_FOLDER_STRING = Path.Combine(@"C:\Users", USERNAME, "Desktop", "END"); // 可自定义复制目标文件夹,比如桌面的MATCHED_FILES文件夹 string TARGET_DIRECTORY = Path.Combine(@"C:\Users", USERNAME, "Desktop", "MATCHED_FILES"); // 确保目标文件夹存在,不存在则创建 Directory.CreateDirectory(TARGET_DIRECTORY); try { string[] startFiles = Directory.GetFiles(START_DIRECTORY); string[] endFiles = Directory.GetFiles(END_FOLDER_STRING); // 提取END文件夹的所有文件名,存入哈希集合(忽略大小写,符合Windows文件系统特性) HashSet<string> endFileNames = new HashSet<string>(StringComparer.OrdinalIgnoreCase); foreach (string file in endFiles) { endFileNames.Add(Path.GetFileName(file)); } // 遍历START文件夹的文件,匹配成功则复制到目标路径 foreach (string startFile in startFiles) { string fileName = Path.GetFileName(startFile); if (endFileNames.Contains(fileName)) { string targetPath = Path.Combine(TARGET_DIRECTORY, fileName); // 第二个参数设为true表示覆盖已存在的目标文件,按需调整 File.Copy(startFile, targetPath, true); Console.WriteLine($"已复制文件: {fileName}"); } } Console.WriteLine("文件匹配复制操作完成!"); } catch (Exception ex) { Console.WriteLine($"操作出错: {ex.Message}"); } } }
关键细节说明
- 路径拼接优化:用
Path.Combine代替手动字符串拼接,能自动处理路径分隔符,避免因为转义符或系统差异导致的路径错误 - 高效查找:使用
HashSet<string>存储END的文件名,查找时间复杂度为O(1),比循环遍历数组高效得多 - 大小写兼容:创建哈希集合时用
StringComparer.OrdinalIgnoreCase,符合Windows文件系统不区分文件名大小写的特性 - 异常防护:添加
try-catch块捕获可能的IO异常(比如文件被占用、权限不足等) - 目标文件夹保障:用
Directory.CreateDirectory确保目标文件夹存在,避免复制时因路径不存在报错
如果你想把文件复制到其他位置,只需要修改TARGET_DIRECTORY的路径即可。
内容的提问来源于stack exchange,提问作者Dibsy
相关产品推荐
相关产品推荐

