2

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

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

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

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

谢谢

4

5 回答 5

3

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

Directory.GetFiles(dirPath, "*" + searchName + "*", SearchOption.AllDirectories);
于 2013-07-02T09:58:23.953 回答
3

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

您还应该使用EnumerateFiles(如果可能)在开始过滤之前不需要将所有内容加载到内存中。此外,使用EqualswithStringComparison.OrdinalIgnoreCase而不是,ToLower因为它更有效且不易出错(土耳其测试)。

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);
}
于 2013-07-02T10:01:32.220 回答
1
return Directory.Exists(dirPath)
           ? Directory.EnumerateFiles(
                dirPath, 
                string.Format("*{0}*",searchName), 
                SearchOption.AllDirectories)
              .Select(x => new FileInfo(x))
           : null;
于 2013-07-02T09:59:34.663 回答
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;
}
于 2013-07-02T10:02:02.743 回答
0

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

于 2013-07-02T10:12:09.943 回答