使用c#在文件中搜索字符串

时间:2016-04-19 07:10:18

标签: c# visual-studio-2010 file-handling

我想在一个大文件中搜索字符串(函数),如果找到,我必须搜索另一个字符串(信号)并替换它。我已经编写了这段代码,但即使在函数之外,信号也会更新。我想修改仅在此函数中找到的信号。我是c#的初学者,任何形式的帮助都会受到赞赏。

if (openFileDialog2.FileName.Contains(function))
                                                File.WriteAllText(openFileDialog2.FileName, File.ReadAllText(openFileDialog2.FileName).Replace(signal, replace));
                                            MessageBox.Show("Done");
                                        }

我也试过了,

 string contents = File.ReadAllText(openFileDialog2.FileName);
                                                if(contents.Contains(function))                                              

        {                                File.WriteAllText(openFileDialog2.FileName, File.ReadAllText(openFileDialog2.FileName).Replace(signal, replace));
                                                MessageBox.Show("Done");
                                            }

即便如此,

using (var reader = new StreamReader(openFileDialog2.FileName))
                                {
                                 string currentLine;
                           if ((currentLine = reader.ReadLine()) != null)
                                    {
                                   while (currentLine.Contains(function))
                                        {
                                                                                     File.WriteAllText(openFileDialog2.FileName, File.ReadAllText(openFileDialog2.FileName).Replace(signal, replace));
                                            MessageBox.Show("Done");
                                        }}}

但似乎没有任何效果。如果代码在没有错误的情况下工作,那么函数外部的信号也会更新。

2 个答案:

答案 0 :(得分:0)

在您的第二个示例中,您似乎在编写新内容后替换了,您可以尝试这样做:

string contents = File.ReadAllText(openFileDialog2.FileName);
if (contents.Contains(function))
{
    File.WriteAllText(openFileDialog2.FileName, contents.Replace(signal, replace));
    MessageBox.Show("Done");
}

这里我们在回写我们阅读的已编辑内容之前替换

答案 1 :(得分:0)

您的第一次尝试毫无意义,处理文件名而不是文件内容。你的第二次尝试字面上说,如果文件包含函数,则替换所有信号 - 没有提示将'信号'搜索的范围限制为所需函数所需的复杂性。你的第三次尝试试图逐行做出正确的事情,但是从那里开始是胡说八道。

您需要编写解析器来限制搜索范围。

打开输入文件和输出文件。一次读一行。 I.如果它包含具有所需名称的函数,则开始将其累积为新字符串 - 从那里,计数大括号打开并关闭,直到计数返回到0(函数结束)。此时,将'signal'替换为'replace',然后将其写入输出。 II。如果它不包含函数,则直接输出。

如果代码是机器生成的,您可以检查新行上的花括号,没有缩进来结束函数。如果代码不是机器生成的,那么你将很难解析它,并且应该找到一些库,它可以在你厌倦修复第100个bug之后为你解析c#代码。