我正在寻找一种改进文件搜索的方法。
目前我正在使用此方法:
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;
}
有更快或更好的方法吗?
由于
答案 0 :(得分:3)
有overload会搜索特定模式。而不是使用搜索模式参数搜索*.*
搜索您感兴趣的文件名。
Directory.GetFiles(dirPath, "*" + searchName + "*", SearchOption.AllDirectories);
答案 1 :(得分:3)
然而,几乎是微优化,您可以提高可读性,并且可以添加异常处理。
您还应该使用EnumerateFiles
(如果可能),它不需要在开始过滤之前将所有内容加载到内存中。另外,使用Equals
与StringComparison.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()来返回一个立即执行的列表。