设置SearchOption.AllDirectories仍遗漏子目录,代码报错如何解决?
问题分析与修复方案
我帮你排查了代码里的几个关键问题,这就是为什么你的方法既没按预期扫到子目录,还出现编译错误的原因:
1. DirectoryInfo 对象不能直接与字符串拼接
你代码里的dirInfo + "\\" + mFile.Name是错误写法——dirInfo是DirectoryInfo类型对象,不能直接和字符串做加法运算,这会直接触发编译错误。应该改用dirInfo.FullName来获取目标目录的完整路径字符串。
2. 文件名筛选条件存在多余空格
你写的.EndsWith(".mkv ")多了一个空格,这样只会匹配文件名末尾带空格的.mkv文件,正常的.mkv文件会被漏掉,把空格删掉就能正确匹配了。
3. 优化文件存在性检查的写法
原代码里new FileInfo(dirInfo + "\\" + mFile.Name).Exists可以改成更简洁高效的File.Exists(Path.Combine(dirInfo.FullName, mFile.Name)),用Path.Combine还能避免手动拼接路径时的分隔符问题。
完整修正后的代码
static void MoveFiles() { string targetDirectory = "D:\\_TestData"; DirectoryInfo targetDirInfo = new DirectoryInfo(targetDirectory); // 确保目标目录存在 if (!targetDirInfo.Exists) { targetDirInfo.Create(); } // 扫描源目录及所有子目录的视频文件 List<string> videoFiles = Directory.GetFiles("D:\\_FinishedData", "*.*", SearchOption.AllDirectories) .Where(s => s.EndsWith(".mp4", StringComparison.OrdinalIgnoreCase) || s.EndsWith(".avi", StringComparison.OrdinalIgnoreCase) || s.EndsWith(".mkv", StringComparison.OrdinalIgnoreCase)) .ToList(); foreach (string file in videoFiles) { FileInfo sourceFile = new FileInfo(file); string targetFilePath = Path.Combine(targetDirInfo.FullName, sourceFile.Name); // 检查目标路径是否已存在该文件 if (!File.Exists(targetFilePath)) { sourceFile.MoveTo(targetFilePath); } } }
额外注意事项
- 我还加了
StringComparison.OrdinalIgnoreCase,这样不管文件名是.MP4还是.mp4都能匹配到,更符合实际使用场景。 - 如果执行时还是扫不到子目录,检查一下
D:\\_FinishedData目录是否有访问权限,或者该目录下的子目录是否真的存在视频文件。
内容的提问来源于stack exchange,提问作者HotTomales
相关产品推荐
相关产品推荐

