【问题标题】:Better Way to find all Files in Directory在目录中查找所有文件的更好方法
【发布时间】:2013-07-02 09:55:38
【问题描述】:

我正在寻找改进文件搜索的方法。

目前我正在使用这种方法:

public IEnumerable<FileInfo> FindFilesInDirectory(string dirPath, string searchName)
{
    return Directory.Exists(dirPath)
               ? Directory.GetFiles(dirPath, "*.*", SearchOption.AllDirectories)
                          .ToList()
                          .ConvertAll(x => new FileInfo(x))
                          .Where(x => x.Name.ToLower().Contains(searchName.ToLower()))
               : null;
}

有没有更快或更好的方法来做到这一点?

谢谢

【问题讨论】:

  • 仅供参考:如果您只对文件名感兴趣,则返回 FileInfo 对象会增加开销。

标签: c# performance file-search


【解决方案1】:

然而,几乎是微优化,您可以提高可读性并且可以添加异常处理。

您还应该使用EnumerateFiles(如果可能),它不需要在开始过滤之前将所有内容加载到内存中。此外,将EqualsStringComparison.OrdinalIgnoreCase 一起使用而不是ToLower,因为它更高效且不易出错(the Turkey test)。

public IEnumerable<FileInfo> FindFilesInDirectory(string dirPath, string searchName)
{
    if (Directory.Exists(dirPath))
    {
        var dir = new DirectoryInfo(dirPath);
        return dir.EnumerateFiles("*.*", SearchOption.AllDirectories)
                  .Where(fi => fi.Name.Equals(searchName, StringComparison.OrdinalIgnoreCase));
    }
    else
        throw new ArgumentException("Directory doesn't exist.", dirPath);
}

【讨论】:

  • 太好了,这正是我要找的。非常感谢!
  • 我的荣幸!请注意,这实际上只返回一个IEnumerable&lt;FileInfo&gt;。因此,如果您将返回值分配给变量,您将始终使用不使用延迟执行的方法(如 Enumerable.Count)来执行此查询。如果你想实现这个查询,你可以添加ToList()。例如:List&lt;FileInfo&gt; files = FindFilesInDirectory(@"D:\", "data.txt").ToList();。但是如果你使用foreach,你也可以在不创建新集合的情况下枚举它。
【解决方案2】:

有一个overload 将搜索特定模式。不要搜索*.*,而是使用搜索模式参数搜索您感兴趣的文件名。

Directory.GetFiles(dirPath, "*" + searchName + "*", SearchOption.AllDirectories);

【讨论】:

  • "*" + searchNamex.Name.ToLower().Contains(searchName.ToLower()) 不太一样,它表示endsWith 搜索而不是包含搜索。
【解决方案3】:
return Directory.Exists(dirPath)
           ? Directory.EnumerateFiles(
                dirPath, 
                string.Format("*{0}*",searchName), 
                SearchOption.AllDirectories)
              .Select(x => new FileInfo(x))
           : null;

【讨论】:

    【解决方案4】:
    public IEnumerable<FileInfo> FindFilesInDirectory(string dirPath, string searchName)
    {
        return Directory.Exists(dirPath)
                   ? Directory.GetFiles(dirPath, "*" + searchName + "*", SearchOption.AllDirectories)
                              .Select(x => new FileInfo(x))
                   : null;
    }
    

    【讨论】:

      【解决方案5】:

      我不知道你对结果做了什么,但我认为值得一提的是,在你的方法中执行查询将被推迟到你实现它。因此,根据您对查询的操作,它可能会减慢执行速度。如果这不是故意的,只需添加一个 .toList() 以返回一个立即执行的列表。

      【讨论】:

        猜你喜欢
        • 2011-01-07
        • 1970-01-01
        • 1970-01-01
        • 2022-10-17
        • 2012-09-16
        • 1970-01-01
        • 1970-01-01
        • 2013-08-07
        • 1970-01-01
        相关资源
        最近更新 更多