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

设置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:28:00