我有一段代码,我正在修改文件的内容。我实际上需要用新行替换文件中的一行。为此,我这样做:
private void btn_edit_Click(object sender, EventArgs e)
{
bufferedListView1.Items.Clear();
StreamReader sr1 = new StreamReader("C:\\sample.txt");
string file= sr1.ReadToEnd();
if (file.Contains(pname + "@" + pno))
{
file.Replace(pname + "@" + pno, txt_editname.Text+"@"+txt_editno.Text);//Results null in file
}
string efile= sr1.ReadToEnd(); // returns null
sr1.Close();
StreamWriter sw1 = new StreamWriter("C:\\sample.txt");
sw1.Write(efile);
sw1.Close();
//Rest of the code
pname, pno contains old values. txt_editname,txt_editno contains new values
我最终在 sample.txt 文件中无内容。是什么原因?
答案 0 :(得分:5)
不,您对file.Replace
的调用完全没有任何用处 - 您没有使用返回值。
字符串在.NET中是不可变的,因此Replace
之类的方法不会更改现有字符串,它们会创建一个新字符串并返回对它的引用。你想要:
file = file.Replace(pname + "@" + pno, ...);
当搜索字符串不在文本中时,这不会做任何事情,你可以无条件地做到这一点。
下一个问题是您正在执行此操作:
string file= sr1.ReadToEnd();
... // code which doesn't change sr1 ...
string efile= sr1.ReadToEnd(); // returns null
这实际上并没有返回null - 它返回一个空字符串...因为你仍在读取你已经阅读过的同一个StreamReader
。你为什么这样做?
请注意,在您致电file
后,您甚至不能使用 Replace
变量。
此外,您的代码缺少using
语句,因此如果抛出异常,您将泄漏文件句柄(直到终结器清除它们)。你可以很容易地避免所有这些 - 我怀疑这会做你想要的:
private void btn_edit_Click(object sender, EventArgs e)
{
bufferedListView1.Items.Clear();
string fileContents = File.ReadAllText("C:\\sample.txt");
string replacedContents = fileContenxt.Replace(pname + "@" + pno,
txt_editname.Text + "@" + txt_editno.Text);
File.WriteAllText("C:\\sample.txt", replacedContents);
// Rest of code
}
另请注意,如果这是在WPF或WinForms应用程序中,您真的不应该在UI线程中执行所有这些IO ...
答案 1 :(得分:1)
file.Replace(pname + "@" + pno, txt_editname.Text+"@"+txt_editno.Text);//Results null in file
返回一个字符串,您必须再次将其分配给文件。
file = file.Replace(pname + "@" + pno, txt_editname.Text+"@"+txt_editno.Text);//Results null in file
答案 2 :(得分:0)
正常,你这样做
string efile= sr1.ReadToEnd(); // returns null
...
sw1.Write(efile);