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すでに読んだものから最後まで読んでいるからです。どうしてそんなことをするのか?

を呼び出した後は変数を使用していないことに注意してください。fileReplace

さらに、コードに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 に答える