在子目录中搜索特定文件的最快方法

时间:2020-06-04 06:20:45

标签: c# winforms

我正在尝试在包含很多文件夹且名称包含特定字符串的文件夹中搜索文件。

我能够做到,但花了我大约 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秒的时间。

2 个答案:

答案 0 :(得分:4)

将搜索与Windows自己的搜索功能进行比较有点无效,因为Windows搜索利用了索引文件系统的优势,而在当前实现中则没有。

但是有个好消息:您也可以这样做。

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

例如,您可以:

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

我不知道3.是否正在为您工作。 1.可能不合时宜,因为您可能不希望潜在地过时的数据。所以我会选择2,但也要打3。

答案 1 :(得分:2)

尝试使用Directory.GetFiles

string[] files = Directory.GetFiles(filePath, "*.pdf", SearchOption.AllDirectories);