0

我有一段代码正在修改文件的内容。我实际上需要用新行替换文件中的一行。为此,我正在这样做:

    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中没有内容。是什么原因?

4

3 回答 3

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...

于 2012-08-06T06:42:17.560 回答
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
于 2012-08-06T06:42:19.060 回答
0

正常,你这样做

string efile= sr1.ReadToEnd(); // returns null
...
sw1.Write(efile);
于 2012-08-06T06:43:02.510 回答