过度广泛的Directory.EnumerateFiles()与多个File.Exists()?

时间:2013-05-08 16:25:22

标签: c# file-io io directory

我正在更新一个程序,该程序除其他外,检查给定路径中是​​否存在文件。这些文件可以位于主路径之外的许多子目录中的任何一个子目录中。以前,我们在整个路径中搜索与给定模式匹配的文件,但部分更新是我们现在有一个单独的数组,其中包含我们期望拥有的文件列表。

鉴于存在该阵列,我正在考虑两种选择:

  1. Directory.EnumerateFiles(startingPath, pattern, SearchOption.Alldirectories)使用相同的调用,然后根据我的数组检查结果(可能通过lambda)。

  2. 对阵列的每个成员使用File.Exists()多次调用。

  3. 在一般情况下,我们讨论的是数组中3个或更少的文件用于任何给定的调用。在高端案例中,我们仍在谈论不到十几个案例。大多数执行都会涉及数百或数千个电话。

    这个程序已经是资源耗费的,所以我绝对想在这里采用最有效的方法。哪个更有效率?有没有更好的办法?如果这将导致改进,则可以将文件名的数据结构从数组更改为其他类型。

1 个答案:

答案 0 :(得分:0)

我会使用第二种方法,即对File.Exists的一堆调用,并以并行方式执行。 File.Exists上的吞吐量成本较低但延迟成本较高,因此对于速度,您希望它是异步的。

开始的基本想法:

var fileExists = myFilePaths
    .AsParallel()
    .ToDictionary(path => path, path => File.Exists(path));

(当然,尝试第一种方法并进行速度比较是完全合理的 - 我只是给出了'最佳猜测'和对第二种方法的评论。)