我想在一个大文件中搜索字符串(函数),如果找到,我必须搜索另一个字符串(信号)并替换它。我已经编写了这段代码,但即使在函数之外,信号也会更新。我想修改仅在此函数中找到的信号。我是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");
}}}
但似乎没有任何效果。如果代码在没有错误的情况下工作,那么函数外部的信号也会更新。
答案 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#代码。