GetFiles和EnumerateFiles跳过foreach循环

时间:2017-06-22 20:02:20

标签: c# foreach fileinfo getfiles directoryinfo

运行以下代码时:

var files = dir.EnumerateFiles("*.*",
    SearchOption.AllDirectories).Where(f => ext.Contains(Path.GetExtension(f.FullName)))
foreach (FileInfo file in files)
  {
    file.CopyTo(destPath, true);
  }

其中 dir 是DirectoryInfo
其中 ext 是包含已接受文件扩展名的字符串列表

进入foreach循环后,文件 null 在foreach内部(在 in 语句中),程序跳回 => 语句,然后填充文件。当它完成后,它会跳过foreach循环并且永远不会进入它。

我迷失在这里。为什么我的代码跳回一行?我尝试了Enumerate和GetFiles,似乎没有工作。

1 个答案:

答案 0 :(得分:0)

代码“跳回”的原因是Deferred Execution。在foreach循环中使用结果之前,您所拥有的LINQ表达式实际上并未执行。

至于跳过foreach循环 - 这是因为枚举为空。正如@Slai在评论中提到的那样,您的扩展名列表可能存在问题(在扩展名称之前忘记'。'是一个常见的错误。)

如果您希望枚举立即执行而不是延迟执行(使调试更容易),最简单的方法就是使用.ToList()结束您的LINQ表达式,如下所示:

var files = dir.EnumerateFiles("*.*", SearchOption.AllDirectories)
    .Where(f => ext.Contains(Path.GetExtension(f.FullName)))
    .ToList();