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

Cde*_*eez 0 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
Run Code Online (Sandbox Code Playgroud)

pname, pno contains old values. txt_editname,txt_editno contains new values

我最终在文件sample.txt没有内容.是什么原因?

Jon*_*eet 5

不,你的调用file.Replace是做绝对没有什么用处 -你不使用的返回值.

字符串在.NET中是不可变的,因此方法Replace不会更改现有字符串,它们会创建一个新字符串并返回对它的引用.你要:

file = file.Replace(pname + "@" + pno, ...);
Run Code Online (Sandbox Code Playgroud)

当搜索字符串不在文本中时,这不会做任何事情,您可以无条件地执行此操作.

接下来的问题是,你这样做:

string file= sr1.ReadToEnd();
... // code which doesn't change sr1 ...
string efile= sr1.ReadToEnd(); // returns null
Run Code Online (Sandbox Code Playgroud)

那实际上并没有返回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
}
Run Code Online (Sandbox Code Playgroud)

另请注意,如果这是在WPF或WinForms应用程序中,您真的不应该在UI线程中执行所有这些IO ...