【问题标题】:C# search all files in a directory that contain a string, then return that stringC# 搜索目录中包含字符串的所有文件,然后返回该字符串
【发布时间】:2016-09-30 01:12:17
【问题描述】:

使用用户输入文本框,我想搜索目录中的哪个文件包含该文本。然后我想解析出信息

但我似乎无法找到字符串或至少无法返回信息。任何帮助将不胜感激。

我当前的代码:

private void btnSearchSerial_Click(object sender, EventArgs e)
{
    dynamic dirScanner = @"\\mypath\";
    string strSerial;
    string strSID;
    string strInputLine;
    string strOutput;

    strSerial = Convert.ToString(txtSerialSearch);
    strSID = Convert.ToString(txtSID);

    if (txtSerialSearch.Text != "" && txtSID.Text != "")
    {
         try
         {                    
              string[] allFiles = Directory.GetFiles(dirScanner);

              foreach (string file in allFiles)
              {
                   if (file.EndsWith(".txt"))                            
                   {  
                        using (StreamReader sr = new StreamReader(file))
                        {
                              while (sr.Peek() >= 0)
                              {
                                   strInputLine = sr.ReadLine();

                                   if (strInputLine.Contains(strSerial))
                                   {
                                        strOutput = Convert.ToString(strInputLine);
                                        lblOutput.Text = Convert.ToString(strOutput);
                                   }
                              }
                        }
                   }
              }
         }
    }
}

【问题讨论】:

  • 问题是什么?
  • 如何让用户从 txt 框中输入 txt 以搜索目录中的所有 .txt 文件并从文件中提取该行以便我可以解析数据。
  • 一目了然,这就是代码已经做了。
  • 我是这么想的,但是当我运行应用程序时,lblOutput.text 仍然为空,
  • 所以使用调试器单步调试代码。

标签: c#


【解决方案1】:

你似乎很迷茫。当您只需要string 时,为什么还要使用dynamic?您的代码有太多不必要的变量和转换。这是一种更简单的方法。如果匹配的行很多,我不知道你希望标签有什么,这里我只放第一个:

string dirScanner = @"\\mypath\";

if (string.IsNullOrWhiteSpace(txtSerialSearch.Text) || string.IsNullOrWhiteSpace(txtSID.Text))
    return;

string[] allFiles = Directory.GetFiles(dirScanner, "*.txt");

foreach (string file in allFiles)
{
    string[] lines = File.ReadAllLines(file);
    string firstOccurrence = lines.FirstOrDefault(l => l.Contains(txtSerialSearch.Text));
    if (firstOccurrence != null)
    {
        lblOutput.Text = firstOccurrence;
        break;
    }
}

【讨论】:

  • 如果这有效或解决了您的问题,您应该将其标记为已接受的答案(选票下方的检查),这样您的问题就不会出现未回答的情况。不管怎样,我看你还有事要做,尤其是那个 SID。
  • 是的,它成功了,谢谢,是的,我打算制作一个输入日志文件,但希望首先让主要功能正常工作。再次感谢!
【解决方案2】:

我已经使用正则表达式实现了相同的功能。你需要使用命名空间using System.Text.RegularExpressions;

 string strSerial = @"Microsoft";
            Regex match = new Regex(strSerial);
            string matchinglines = string.Empty;
            List<string> filenames = new List<string>(Directory.GetFiles(textBox1.Text));
            foreach(string filename in filenames)
            {
                //StreamReader strFile = new StreamReader(filename);
                string fileContent = File.ReadAllText(filename);
                if(match.IsMatch(fileContent))
                {
                    label1.Text = Regex.Match(fileContent, strSerial).ToString();
                    break;
                }
            }

【讨论】:

  • 正则表达式是干什么用的?它在哪里?你的模式只是一个文字字符串。如果您只是在做 Contains,那么 RegEx 没有任何好处。
  • 这只是不同的方法。我同意你的看法。在这种情况下,正则表达式不会带来额外的价值。此外,在这种情况下,与正则表达式相比,您的解决方案具有更高的性能。 stackoverflow.com/questions/2962670/…
  • 谢谢,他们都工作了,很高兴学习不同的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多