更好的方法来查找目录中的所有文件

时间:2013-07-02 09:55:39

标签: c# performance file-search

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

目前我正在使用此方法:

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;
}

有更快或更好的方法吗?

由于

5 个答案:

答案 0 :(得分:3)

overload会搜索特定模式。而不是使用搜索模式参数搜索*.*搜索您感兴趣的文件名。

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

答案 1 :(得分:3)

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

您还应该使用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);
}

答案 2 :(得分:1)

return Directory.Exists(dirPath)
           ? Directory.EnumerateFiles(
                dirPath, 
                string.Format("*{0}*",searchName), 
                SearchOption.AllDirectories)
              .Select(x => new FileInfo(x))
           : null;

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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