为什么在文件中搜索特定文本时,我会得到奇怪的结果?

时间:2016-03-14 08:32:54

标签: c# .net winforms

在backgroundworker dowork事件中

string CurrentFileWithPath;
        private void _FileProcessingWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                object[] CurrentStatus = new object[5];
                DirectoryInfo[] MySubDirectories = (DirectoryInfo[])e.Argument;
                for (int i = 0; i < MySubDirectories.GetLength(0); i++)
                {
                    DirectoryInfo MySubDirectory = MySubDirectories[i];

                    List<FileInfo> l = new List<FileInfo>();
                    CountFiles(MySubDirectory, l);

                    int totalFiles = l.Count;

                    CurrentStatus[3] = i.ToString();
                    CurrentStatus[4] = totalFiles.ToString();
                    _FileProcessingWorker.ReportProgress(0, CurrentStatus);

                    string CurrentDirectory = "Current Directory: " + MySubDirectory.Name;

                    foreach (FileInfo MyFile in l)
                    {
                        if (_FileProcessingWorker.CancellationPending)
                        {
                            e.Cancel = true;
                            return;
                        }

                        if (MyFile.Extension.ToLower() == ".cs" || MyFile.Extension.ToLower() == ".vb")
                        {
                            string CurrentFile = "Current File: " + MyFile.Name;
                            string CurrentFileWithPath = MyFile.FullName;

                            CurrentStatus[0] = CurrentDirectory;
                            CurrentStatus[1] = CurrentFile;
                            _FileProcessingWorker.ReportProgress(0, CurrentStatus);

                            List<string> Result = SearchInFile(CurrentFileWithPath, "static class FileShellExtension");

                            if (Result != null && Result.Count > 0)
                            {
                                CurrentStatus[2] = Result;
                                _FileProcessingWorker.ReportProgress(0, CurrentStatus);
                            }
                        }
                    }
                }
            }
            catch (Exception err)
            {
                return;
            }
       }

然后是CountFiles方法

private void CountFiles(DirectoryInfo di, List<FileInfo> l)
        {
            try
            {
                l.AddRange(di.EnumerateFiles());
            }
            catch
            {
                string fff = "";
            }

            try
            {
                IEnumerable<DirectoryInfo> subDirs = di.EnumerateDirectories();
                if (subDirs.Count() > 0)
                {
                    foreach (DirectoryInfo dir in subDirs)
                        CountFiles(dir, l);
                }
            }
            catch 
            {
                string yyy = "";
            }
        }

backgroundworker progresschanged事件

private void _FileProcessingWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            if (typeof(object[]) == e.UserState.GetType())
            {
                object[] StatusMsg = (object[])e.UserState;
                if (5 == StatusMsg.GetLength(0))
                {
                    label2.Text = StatusMsg[4].ToString();
                    label4.Text = StatusMsg[3].ToString();

                    if (StatusMsg[0] != null && StatusMsg[1] != null)
                    {
                        lblCurrentDirectory.Text = StatusMsg[0].ToString();
                        lblStatus.Text = StatusMsg[1].ToString();
                    }
                    if (StatusMsg[2] != null)
                    {
                        if (StatusMsg[2].GetType() == typeof(List<string>))
                        {
                            List<string> l = (List<string>)StatusMsg[2];

                            for (int i = 0; i < l.Count; i++)
                            {
                                ListViewCostumControl.lvnf.Items.Add("Directory: " + lblCurrentDirectory.Text + "In File: " + lblStatus.Text + l[i]);
                                w.WriteLine("Directory: " + lblCurrentDirectory.Text + "In File: " + lblStatus.Text + l[i]);
                            }
                        }
                    }
                }
            }
        }

最后使用SearchInFiles方法搜索每行中每个.cs文件中的匹配项:

private List<string> SearchInFile(string fileToSearch, string textToSearch)
        {
            List<string> l = new List<string>();
            try
            {
                foreach (var line in File.ReadAllLines(fileToSearch))
                {
                    if (line.Contains(textToSearch))
                        l.Add(line);
                }
            }
            catch(Exception err)
            {
                string fff = err.ToString();
            }

            return l;
        }

在这种情况下,我正在搜索字符串:&#34;静态类FileShellExtension&#34;

List<string> Result = SearchInFile(CurrentFileWithPath, "static class FileShellExtension");

我还将结果写入文本文件。 我知道&#34;静态类FileShellExtension&#34;存在于一个或两个文件中。 但是,当我进行搜索时,我得到的结果太多,其中很多都是相同的,其中很多都不是逻辑,而是将结果记录在根本不存在的文件中。< / p>

这是我写入文本文件的结果的一部分:

  

目录:当前目录:ShellContextMenuIn文件:当前文件:Program.cs静态类FileShellExtension   目录:当前目录:ShellContextMenuIn文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:ShellContextMenuIn文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:ShellContextMenuIn文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:ShellContextMenuIn文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:ShellContextMenuIn文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:ShellContextMenuIn文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:ShellContextMenuIn文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:ShellContextMenuIn文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:smscIn文件:当前文件:TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs静态类FileShellExtension   目录:当前目录:smscIn文件:当前文件:Resources.Designer.cs静态类FileShellExtension   目录:当前目录:smscIn文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:smscIn文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:smscIn文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:smscIn文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:smscIn文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:smscIn文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:smscIn文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:smscIn文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:SnowFlakeIn文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:SnowFlakeIn文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:SnowFlakeIn文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:SnowFlakeIn文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:SocialHardwareIn文件:当前文件:AssemblyInfo.cs静态类FileShellExtension   目录:当前目录:SocialHardwareIn文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:SocialHardwareIn文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:SocialHardwareIn文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:SocialHardwareIn文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:SocialHardwareIn文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:SpeechRecognizerIn文件:当前文件:TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs静态类FileShellExtension   目录:当前目录:SpeechRecognizerIn文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:SpeechRecognizerIn文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:SpeechRecognizerIn文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:SpeechRecognizerIn文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:SpeechRecognizerIn文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:SpeechRecognizerIn文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:SpeechRecognizerIn文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:SpeechRecognizerIn文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:SpeechRecognizerIn文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:SpeechRecognizerIn文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:SpeechRecognizerIn文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:SpeechRecognizerIn文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:SpeechRecognizerIn文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:SpeechRecognizerIn文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:Speech_Recognition_Version_1.001In文件:当前文件:AssemblyInfo.cs静态类FileShellExtension   目录:当前目录:Speech_Recognition_Version_1.001In文件:当前文件:Form1.Designer.cs静态类FileShellExtension   目录:当前目录:Speech_Recognition_Version_1.001In文件:当前文件:Statistic.Designer.cs静态类FileShellExtension   目录:当前目录:Speech_Recognition_Version_1.001In文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:Speech_Recognition_Version_1.001In文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:Speech_Recognition_Version_1.001In文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:Speech_Recognition_Version_1.001In文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:Speech_Recognition_Version_1.001In文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:Speech_Recognition_Version_1.001In文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:Speech_Recognition_Version_1.001In文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:Speech_Recognition_Version_1.001In文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:Speech_Recognition_Version_1.001In文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:Speech_Recognition_Version_1.001In文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:Speech_Recognition_Version_1.001In文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:Speech_Recognition_Version_1.001In文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:Speech_Recognition_Version_1.001In文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:Speech_Recognition_Version_1.001In文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:Speech_Recognition_Version_1.001In文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:Speech_Recognition_Version_1.001In文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:Speech_Recognition_Version_1.002In文件:当前文件:Program.cs静态类FileShellExtension   目录:当前目录:Speech_Recognition_Version_1.002In文件:当前文件:Resources.Designer.cs静态类FileShellExtension   目录:当前目录:Speech_Recognition_Version_1.002In文件:当前文件:Logger.cs静态类FileShellExtension   目录:当前目录:Speech_Recognition_Version_1.002In文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:Speech_Recognition_Version_1.002In文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:Speech_Recognition_Version_1.002In文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:Speech_Recognition_Version_1.002In文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:Speech_Recognition_Version_1.002In文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:Speech_Recognition_Version_1.002In文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:Speech_Recognition_Version_1.002In文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:具有进度条的初始屏幕文件:当前文件:AssemblyInfo.cs静态类FileShellExtension   目录:当前目录:具有进度条的初始屏幕文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:具有进度条的初始屏幕文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:具有进度条的初始屏幕文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:具有进度条的初始屏幕文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:具有进度条的初始屏幕文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:具有进度条的初始屏幕文件:当前文件:Settings.Designer.cs静态类FileShellExtension   目录:当前目录:具有进度条的初始屏幕文件:当前文件:Settings.Designer.cs静态类FileShellExtension

如果我将以结果行为例:

目录:当前目录:具有进度条的初始屏幕文件:当前文件:Settings.Designer.cs静态类FileShellExtension

我检查了很多次没有任何文字&#34;静态类FileShellExtension&#34;在Settings.Designer.cs

我无法弄清楚为什么我会得到这么多相同的结果,并且在很多地方和文件中它都不存在。

如果文件中存在,我确实希望获得多于一个结果。例如,如果在文件Form1.cs中有5行包含&#34;静态类FileShellExtension&#34;然后在文本文件中写入5行完整的5行。

但我现在得到的是一团糟。

您可以在此处更好地查看文本文件的内容:http://textuploader.com/5n5f4

1 个答案:

答案 0 :(得分:2)

嗯,我认为问题可能是你的CurrentStatus对象。您应该在循环中移动此定义object[] CurrentStatus = new object[5];。正如你现在所知,当你第一次出现时,你设置CurrentStatus[2] = Result;并且它一直保持这种状态。

作为替代方案,如果Result为null或Result.Count为0

,请设置CurrentStatus[2] = null;