String.Replace()擦除整个字符串-C#

时间:2012-08-06 06:40:02

标签: c# file str-replace

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

    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 文件中无内容。是什么原因?

3 个答案:

答案 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);