C# 在文件中搜索文本时,如何重复搜索而不重新检索文件?

C# 在文件中搜索文本时,如何重复搜索而不重新检索文件?,c#,.net,winforms,C#,.net,Winforms,我在搜索时使用两种方法。首先检索文件,然后在文件中搜索 但在某些情况下,我只更改搜索文本,我想在相同的目录和文件中重复搜索。那么我怎样才能让它记住最后检索到的文件呢 这是启动backgorundworker和搜索方法的按钮单击事件: private void startButton_Click(object sender, EventArgs e) { ListViewCostumControl.lvnf.Items.Clear();

我在搜索时使用两种方法。首先检索文件,然后在文件中搜索

但在某些情况下,我只更改搜索文本,我想在相同的目录和文件中重复搜索。那么我怎样才能让它记住最后检索到的文件呢

这是启动backgorundworker和搜索方法的按钮单击事件:

private void startButton_Click(object sender, EventArgs e)
        {
            ListViewCostumControl.lvnf.Items.Clear();
            numberoffiles = 0;
            numberofrestrictedFiles = 0;
            numberofdirs = 0;
            label24.Text = "0";
            label1.Text = "0";
            label15.Text = "0";
            Logger.Write("Operation started");
            label21.Text = "Phase 1: Retrieving files";
            label21.Visible = true;
            startButton.Enabled = false;
            stopButton.Enabled = true;
            pauseresumeButton.Enabled = true;
            label1.Select();
            timer1.Start();
            if (!backgroundWorker1.IsBusy)
            {
                SetWorkerMode(true);
                backgroundWorker1.RunWorkerAsync();
            }
        }
int numberofdirs = 0;
        void DirSearch(string rootDirectory, string filesExtension, string[] textToSearch, BackgroundWorker worker, DoWorkEventArgs e)
        {
            List<string> resultsoftextfound = new List<string>();
            List<string> resultsoftextfound1 = new List<string>();
            List<string> filePathList = new List<string>();
            int numberoffiles = 0;
            try
            {
                filePathList = SearchAccessibleFilesNoDistinct(rootDirectory, null,worker,e).ToList();
            }
            catch (Exception err)
            {
                string ad = err.ToString();
            }
            label21.Invoke((MethodInvoker)delegate
                    {
                        label21.Text = "Phase 2: Searching in files";
                    });
            MyProgress myp = new MyProgress();
            myp.Report4 = filePathList.Count.ToString();
            foreach (string file in filePathList)
            {
                try
                {
                    _busy.WaitOne();
                    if (worker.CancellationPending == true)
                    {
                        e.Cancel = true;
                        return;
                    }

                    bool reportedFile = false;

                    for (int i = 0; i < textToSearch.Length; i++)
                    {
                        if (File.ReadAllText(file).IndexOf(textToSearch[i], StringComparison.InvariantCultureIgnoreCase) >= 0)
                        {
                            resultsoftextfound.Add(file + "  " + textToSearch[i]);
                            if (!reportedFile)
                            {
                                numberoffiles++;

                                myp.Report1 = file;
                                myp.Report2 = numberoffiles.ToString();
                                myp.Report3 = textToSearch[i];
                                backgroundWorker1.ReportProgress(0, myp);
                                reportedFile = true;
                            }
                        }
                    }
                    numberofdirs++;
                    label1.Invoke((MethodInvoker)delegate
                    {
                        label1.Text = string.Format("{0}/{1}", numberofdirs, myp.Report4);
                        label1.Visible = true;
                    });
                }
                catch (Exception)
                {

                }
            }
        }
这是backgroundworker事件中已完成的我正在向文本文件写入一些信息,但不是全部检索到的文件

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker worker = sender as BackgroundWorker;
            _stopwatch.Restart();
            string[] values = textBox1.Text.Split(new string[] { ",," }, StringSplitOptions.None);
            DirSearch(textBox3.Text, textBox2.Text, values, worker, e);
            _stopwatch.Stop();
        }

        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            MyProgress mypro = (MyProgress)e.UserState;
            ListViewCostumControl.lvnf.Items.Add(mypro.Report1);
            label15.Text = mypro.Report2;
            label15.Visible = true;
            if (ListViewCostumControl.lvnf.Items.Count > 9)
                textBox4.Enabled = true;
        }

        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Cancelled == true)
            {
                label1.Select();
                _stopwatch.Stop();
                label24.Text = "0";
                label5.Text = "00:00:00";
                label1.Text = "0";
                label11.Text = "0";
                label15.Text = "0";
                label24.Text = "0";
                pauseresumeButton.Enabled = false;
                stopButton.Enabled = false;
                startButton.Enabled = true;
                timer1.Stop();
                ListViewCostumControl.lvnf.Items.Clear();
                Logger.Write("Operation cancelled");
                button4.Enabled = true;
            }
            if (e.Error != null)
            {

            }
            else
            {
                label1.Select();
                _stopwatch.Stop();
                timer1.Stop();
                stopButton.Enabled = false;
                pauseresumeButton.Enabled = false;
                startButton.Enabled = true;
                label21.Text = "Last operation ended at: " + DateTime.Now;
                Logger.Write("Number of retrieved files: " + numberoffiles);
                Logger.Write("Number of restricted files: " + numberofrestrictedFiles);
                Logger.Write("Number of searched files: " + numberofdirs);
                Logger.Write("Number of results: " + label15.Text);
                Logger.Write("Searched root directory: " + textBox3.Text);
                Logger.Write("Operation time: " + _stopwatch.Elapsed);
                Logger.Write("Operation ended");
                Logger.Write(" ");
                button4.Enabled = true;
                mCompleted = true;
                if (mClosePending) this.Close();
            }
        }
以下是搜索方法:

private void startButton_Click(object sender, EventArgs e)
        {
            ListViewCostumControl.lvnf.Items.Clear();
            numberoffiles = 0;
            numberofrestrictedFiles = 0;
            numberofdirs = 0;
            label24.Text = "0";
            label1.Text = "0";
            label15.Text = "0";
            Logger.Write("Operation started");
            label21.Text = "Phase 1: Retrieving files";
            label21.Visible = true;
            startButton.Enabled = false;
            stopButton.Enabled = true;
            pauseresumeButton.Enabled = true;
            label1.Select();
            timer1.Start();
            if (!backgroundWorker1.IsBusy)
            {
                SetWorkerMode(true);
                backgroundWorker1.RunWorkerAsync();
            }
        }
int numberofdirs = 0;
        void DirSearch(string rootDirectory, string filesExtension, string[] textToSearch, BackgroundWorker worker, DoWorkEventArgs e)
        {
            List<string> resultsoftextfound = new List<string>();
            List<string> resultsoftextfound1 = new List<string>();
            List<string> filePathList = new List<string>();
            int numberoffiles = 0;
            try
            {
                filePathList = SearchAccessibleFilesNoDistinct(rootDirectory, null,worker,e).ToList();
            }
            catch (Exception err)
            {
                string ad = err.ToString();
            }
            label21.Invoke((MethodInvoker)delegate
                    {
                        label21.Text = "Phase 2: Searching in files";
                    });
            MyProgress myp = new MyProgress();
            myp.Report4 = filePathList.Count.ToString();
            foreach (string file in filePathList)
            {
                try
                {
                    _busy.WaitOne();
                    if (worker.CancellationPending == true)
                    {
                        e.Cancel = true;
                        return;
                    }

                    bool reportedFile = false;

                    for (int i = 0; i < textToSearch.Length; i++)
                    {
                        if (File.ReadAllText(file).IndexOf(textToSearch[i], StringComparison.InvariantCultureIgnoreCase) >= 0)
                        {
                            resultsoftextfound.Add(file + "  " + textToSearch[i]);
                            if (!reportedFile)
                            {
                                numberoffiles++;

                                myp.Report1 = file;
                                myp.Report2 = numberoffiles.ToString();
                                myp.Report3 = textToSearch[i];
                                backgroundWorker1.ReportProgress(0, myp);
                                reportedFile = true;
                            }
                        }
                    }
                    numberofdirs++;
                    label1.Invoke((MethodInvoker)delegate
                    {
                        label1.Text = string.Format("{0}/{1}", numberofdirs, myp.Report4);
                        label1.Visible = true;
                    });
                }
                catch (Exception)
                {

                }
            }
        }
如果用户在文本框1中输入

以后将文本作为另一个搜索文本。

void lvnf_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (ListViewCostumControl.lvnf.SelectedItems.Count > 0)
            {
                results = new List<int>();
                richTextBox1.Text = File.ReadAllText(ListViewCostumControl.lvnf.Items[ListViewCostumControl.lvnf.SelectedIndices[0]].Text);
                FileInfo fi = new FileInfo(ListViewCostumControl.lvnf.Items[ListViewCostumControl.lvnf.SelectedIndices[0]].Text);
                label17.Text = ExtensionMethods.ToFileSize(fi.Length);
                label17.Visible = true;
                filePath = Path.GetDirectoryName(fi.FullName);
                string word = textBox1.Text;
                string[] test = word.Split(new string[] { ",," }, StringSplitOptions.None);
                foreach (string myword in test)
                {
                    HighlightPhrase(richTextBox1, myword, Color.Yellow);
                    label16.Text = results.Count.ToString();
                    label16.Visible = true;
                    if (results.Count > 0)
                    {
                        numericUpDown1.Maximum = results.Count;
                        numericUpDown1.Enabled = true;
                        richTextBox1.SelectionStart = results[(int)numericUpDown1.Value - 1];
                        richTextBox1.ScrollToCaret();
                    }
                }
            }
        }
void lvnf\u SelectedIndexChanged(对象发送方,事件参数e)
{
如果(ListViewCostumControl.lvnf.SelectedItems.Count>0)
{
结果=新列表();
richTextBox1.Text=File.ReadAllText(ListViewCostumControl.lvnf.Items[ListViewCostumControl.lvnf.SelectedDices[0].Text);
FileInfo fi=新文件信息(ListViewCostumControl.lvnf.Items[ListViewCostumControl.lvnf.SelectedIndices[0]].Text);
label17.Text=ExtensionMethods.ToFileSize(fi.Length);
标签17.可见=真实;
filePath=Path.GetDirectoryName(fi.FullName);
字符串字=textBox1.Text;
string[]test=word.Split(新字符串[]{“,”},StringSplitOptions.None);
foreach(测试中的字符串myword)
{
HighlightPhrase(richTextBox1,myword,Color.Yellow);
label16.Text=results.Count.ToString();
label16.可见=真;
如果(results.Count>0)
{
numericUpDown1.Maximum=results.Count;
numericUpDown1.Enabled=true;
richTextBox1.SelectionStart=结果[(int)numericUpDown1.Value-1];
richTextBox1.ScrollToCaret();
}
}
}
}
例如,如果我键入以搜索表格1,则为表格1

然后它将搜索Form1和Form1的所有结果

或者,如果我键入Form1,则输入“帮助”

然后,结果也将用于Form1和帮助

这个问题不确定一个问题是否更符合逻辑。当我只输入Frime1时,我是否应该将它视为形式1,还是应该将它保留为现在的形式1,形式1? 在我搜索切换摄像机之前,它找到了结果,但在此之前,我搜索切换摄像机,它没有找到任何结果,我没有在切换摄像机之间放置

所以我认为通过逻辑切换摄像机也应该找到切换摄像机

那么,如果没有,,但是单词之间有空格,那么如何更改此搜索规则来搜索一个单词呢


切换摄影机也会找到切换摄影机,但切换、、摄影机可能会找到更多结果。

虽然通常在此处显示代码是一件好事,你应该试着把这个问题简化成一个更简洁的版本。请发布一个或,突出你遇到的问题,这样我们可以提供更好的帮助,而通常在这里显示代码是一件好事,你应该试着把这个问题简化成一个更简洁的版本。请发表一篇文章,突出你遇到的问题,这样我们可以更好地提供帮助