从共享驱动器加载大量文本文件以搜索世界.C#



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

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

  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();
    }
  }
}

到目前为止,这可以处理3000个文件,但我需要访问一个包含90000个文件的共享驱动器,当我尝试在共享驱动器中搜索时,windows窗体会被冻结。我真的很感激你们所有人的帮助。

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

此外,如果你只需要在文件中搜索特定的单词,你有没有研究过像grep这样的现有工具?

相关内容

  • 没有找到相关文章

最新更新