c# - 在子目录中搜索特定文件的最快方法
问题描述
我正在尝试在包含大量文件夹的文件夹中搜索文件,其名称包含特定字符串。
我能做到,但这需要我大约2 分钟,这对我来说时间太长了。
这是功能:
private void Search()
{
foreach (var file in Directory.EnumerateFiles(@"P:\system\mail\", "*" + textBox1.Text + "*.pdf*", SearchOption.AllDirectories))
{
this.Invoke(new MethodInvoker(delegate ()
{
listBoxControl1.Items.Add(file);
}));
if (XtraMessageBox.Show("Open the file: " + file + " ?", "Information", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK)
{
Process.Start(file);
}
}
}
这就是我使用该功能的地方:
private async void simpleButton1_Click(object sender, EventArgs e)
{
labelControl1.Text = "Status: Please wait . . .";
Stopwatch watch = new Stopwatch();
watch.Start();
await Task.Run(() => Search());
watch.Stop();
labelControl1.Text = "The process done in " + watch.Elapsed.TotalMinutes.ToString() + " minutes.";
}
目标是像在 windows 中搜索那样花费我4-7 秒。
解决方案
将您的搜索与 Windows 自己的搜索功能进行比较在某种程度上是无效的,因为 Windows 搜索利用了对文件系统的索引,而在您当前的实现中,您没有。
但有一个好消息:你也可以做到。
有几种方法可以实现相似的响应时间,有些更快,有些更精确。
例如,您可以:
- 以固定的时间间隔执行搜索并使用结果。缺点:列表可能已过时。或者...
- 在 App start 上进行初始搜索,然后使用FileSystemWatcher获取有关 FileSystem 事件的通知(文件新、文件删除、文件移动......)以更新您的内部索引。使用该索引作为您的信息来源。缺点:FSW处理起来会很痛苦。
- 找到一种方法来利用 Windows 自己的索引。看:
- 所以回答https://stackoverflow.com/a/34340288/982149利用 OLE DB Api 并且可能已经过时了!
- Windows 搜索开发人员指南
我不知道 3. 是否适合你。1. 可能会退出比赛,因为您可能不想要可能过时的数据。所以我会选择 2,但也可以尝试 3。
推荐阅读
- python - Pandas multiindex:获取没有重复的级别值
- machine-learning - 机器活动的时间序列聚类
- php - mysqli_num_rows 不工作?
- azure - Raspberry Pi 3 B+ 设置问题:“错误:'TLSv1_method' 已弃用”
- r - 使用 as.factor 时在 ggplot2 中重新排序条形图输出
- javascript - window.onunload 事件不会在 AngularJS 控制器中触发
- c++-winrt - 如何在 winrt::impl::blocking_suspend 中解决断言 WINRT_ASSERT(!is_sta())
- azure - Azure Functions 静态 SqlConnection - 正确的扩展方式?
- kubernetes - 对 Kubernetes 的 NUMA 亲和性 --cpu-manager-policy
- reactjs.net - 在 IIS 生产服务器上没有编译