首页 > 解决方案 > 在子目录中搜索特定文件的最快方法

问题描述

我正在尝试在包含大量文件夹的文件夹中搜索文件,其名称包含特定字符串。

我能做到,但这需要我大约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 秒

标签: c#winforms

解决方案


将您的搜索与 Windows 自己的搜索功能进行比较在某种程度上是无效的,因为 Windows 搜索利用了对文件系统的索引,而在您当前的实现中,您没有。

但有一个好消息:你也可以做到。

有几种方法可以实现相似的响应时间,有些更快,有些更精确。

例如,您可以:

  1. 以固定的时间间隔执行搜索并使用结果。缺点:列表可能已过时。或者...
  2. 在 App start 上进行初始搜索,然后使用FileSystemWatcher获取有关 FileSystem 事件的通知(文件新、文件删除、文件移动......)以更新您的内部索引。使用该索引作为您的信息来源。缺点:FSW处理起来很痛苦。
  3. 找到一种方法来利用 Windows 自己的索引。看:

我不知道 3. 是否适合你。1. 可能会退出比赛,因为您可能不想要可能过时的数据。所以我会选择 2,但也可以尝试 3。


推荐阅读