0

我试图在包含至少 90,000 个文件的共享驱动器中执行搜索。

下面的代码是我所拥有的:

  private void button2_Click(object sender, EventArgs e)
  {

        if (string.IsNullOrEmpty(textBox1.Text))
        {
            MessageBox.Show("No folder: Not listed", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
        }
        else
        {

            List<string> allFiles = new List<string>();
            AddFilesnames(sourceFolder, allFiles);

            foreach (string fileName in allFiles)
            {
                string contents = File.ReadAllText(fileName);
                if (contents.Contains(searchword))
                {
                    listBox1.BeginUpdate();
                    listBox1.Items.Add(fileName);
                    listBox1.EndUpdate();
                    label4.Text = (Convert.ToInt32(label4.Text) + 1).ToString();
                }

            }

            if (listBox1.Items.Count == 0)
            {
                MessageBox.Show("no files");
            }
        }
    }

    public void listboxtofile()
    {
        DialogResult resDialog = dlgSaveFile.ShowDialog();
        if (resDialog.ToString() == "OK")
        {
            FileInfo fi = new FileInfo(dlgSaveFile.FileName);
            StreamWriter sw = fi.CreateText();
            foreach (string sItem in listBox1.Items)
            {
                sw.WriteLine(sItem);
            }
            sw.Close();
        }
    }

    public  void AddFilesnames(string sourceDir, List<string> allFiles)
    {
        string[] fileEntries = Directory.GetFiles(sourceDir);
        foreach (string fileName in fileEntries)
        { 
            DateTime from1 = dateTimePicker1.Value.Date;
            DateTime to1 = dateTimePicker2.Value.Date;
            DateTime creationTime = File.GetCreationTime(fileName);

            if (creationTime >= from1 && creationTime <= to1)
            {
                allFiles.Add(fileName);
            }               

        }

        //Recursion   
        string[] subdirectoryEntries = Directory.GetDirectories(sourceDir);
        foreach (string item in subdirectoryEntries)
        {
            // Avoid "reparse points"
            if ((File.GetAttributes(item) & FileAttributes.ReparsePoint) != FileAttributes.ReparsePoint)
            {
                AddFileNamesToList(item, allFiles);
                label4.Text = (Convert.ToInt32(label4.Text) + 1).ToString();
            }
        }
    }

    private void button3_Click(object sender, EventArgs e)
    {
        listBox1.Items.Clear();

        textBox1.Clear();
    }

    private void button5_Click(object sender, EventArgs e)
    {
        listboxtofile();
    }
  }
}

到目前为止,这正在处理 3,000 个文件,但我需要访问包含 90,000 个文件的共享驱动器,当我尝试在共享驱动器中搜索时,Windows 窗体被冻结。我真的很感谢你们的任何帮助。

4

1 回答 1

0

我的建议是在单独的线程中执行任何文件系统工作。如果您在与表单相同的线程中进行文件搜索,Windows 将没有机会更新表单。您将无法直接从新线程更新任何表单控件(如 listBox1),但您可以查看委托和 C# 线程以寻找解决此问题的方法。

此外,如果您只需要在文件中搜索特定单词,您是否查看过现有工具(如 grep)?

于 2013-08-07T03:05:31.353 回答