1

やあみんな、ここでちょっとした問題を抱えています。

そのため、ファイルをロードするロード ボタンと、ファイルを保存する保存ボタンがあります。プログラムを閉じる終了ボタンもあります。私が助けを必要としているのは、プログラムを閉じるときに、閉じられていない StreamReader または StreamWriter があるかどうかを確認することです。

私がこれまでに持っているものは次のとおりです。上部で、私はこれらの人を宣言します

    bool isDirtyBoolean = false;
    string moreData = "";

私のロードボタンはこのように見えます

    private void loadToolStripMenuItem_Click(object sender, EventArgs e)
    {
        //begin in the project folder
        openFileDialog1.InitialDirectory = Directory.GetCurrentDirectory();

        //display the file open dialog box
        DialogResult responseDialogResult;
        responseDialogResult = openFileDialog1.ShowDialog();

        if (responseDialogResult != DialogResult.Cancel)
        {   //check that user did not click the cancel button
            //create a streamreader object for the selected file, 
            //read the file contents,
            //and display each line of the file in the list box

            StreamReader nameStreamReader = new StreamReader(openFileDialog1.FileName);

            while (nameStreamReader.Peek() != -1)
            {
                freindsDataListBox.Items.Add(nameStreamReader.ReadLine());

            }

            nameStreamReader.Close();
            isDirtyBoolean = true;
        }
    }

そして、私の保存ボタンは次のようになります

        private void saveToolStripMenuItem_Click(object sender, EventArgs e)
    {
        //begin in the project folder
        saveFileDialog1.InitialDirectory = Directory.GetCurrentDirectory();

        //display the file save dialog 
        DialogResult responseDialogResult;
        responseDialogResult = saveFileDialog1.ShowDialog();

        if (responseDialogResult != DialogResult.Cancel)
        {   //check that user did not click the cancel button
            //create a streamWriter object and 
            //then write out the list box items to the file

            StreamWriter nameStreamWriter = new StreamWriter(saveFileDialog1.FileName);

            int count = freindsDataListBox.Items.Count;
            for (int i = 0; i < count; i++)
            {
                nameStreamWriter.WriteLine(freindsDataListBox.Items[i]);
            }

            nameStreamWriter.Close();
            isDirtyBoolean = true;
            freindsDataListBox.Items.Clear();
        }
    }

私の終了ボタンは次のようになります

        private void exitToolStripMenuItem_Click(object sender, EventArgs e)
    {
        if (isDirtyBoolean == false)
            nameStreamReader.Close();
            nameStreamWriter.Close();

        this.Close();
    }

私がやろうとしたのは、bool isDirtyBoolean を一番上に設定し、Stream Reader または Writer が閉じたときに bool 値を true に設定することでした。そのため、アプリを終了すると、まだ false に設定されている場合は、とにかくそれらを閉じます。

しかし、 isDirtyBoolean の値はこれらのプライベートな無効ボタンであり、それらにアクセスできないため、これは機能しません。

4

3 に答える 3

2

一般的に物事をよりよく追跡するには、アプリケーションの期間中はライブのままにするのではなく、開いたのと同じ方法でリーダーとライターを閉じます。

使用するusingと、それらは自動的に破棄 (およびクローズ) されます。例:

読者:

using (StreamReader reader = new StreamReader(openFileDialog1.FileName)) {

    // do your stuff...

} // automatic close.

ライター インスタンスでも同じことができます。

または、読み取りと書き込みを同時に行っている場合は、次のように両方を開き、最後に両方を自動的に閉じることができます。

using (StreamReader reader = new StreamReader(openFileDialog1.FileName)) {
    using (StreamWriter writer = new StreamWriter(path_to_other_file)) {

        // now you're reading and writing

        // DO YOUR STUFF

    } // closes writer.
} // closes reader.

このようusingに機能する理由は、ストリーム リーダー クラスとライター クラスの両方によって実装されるIDisposableインターフェイスのためです。using実際、このインターフェイスを実装するクラスは、ステートメント onを使用する候補です。


また、次のような MSDN ドキュメントの警告に注意してください。

StreamWriter.Dispose は常にストリームを閉じます

StreamWriter.Dispose は常にストリームを閉じます StreamWriter を破棄すると、明示的にストリームを提供するコンストラクターを使用している場合でも、基になるストリームが破棄されるときに閉じます。ストリームを開いたままにしたい場合がありますが、このクラスは現在、Dispose を呼び出さないことを除いてそれを行うメカニズムを提供していませんが、代わりに必ず Flush を呼び出してください。

于 2010-10-10T01:00:09.740 に答える
1

まず第一に、ストリームを問題なく閉じています-ただし、「using」ステートメントを使用して、例外があってもストリームが閉じられていることを確認します。したがって、フォームが終了したときにそれらを閉じる必要はありません。

また、これは悪いコーディングです:

if (isDirtyBoolean == false)
        nameStreamReader.Close();
        nameStreamWriter.Close();

あなたの if 条件は、最初のステートメントでのみ機能します。if の後に中括弧を付ける必要があります。

于 2010-10-09T21:54:35.590 に答える
1

「using」を使用するか、独自の try/catch/finally ブロックを記述して、finally でストリームを閉じます。

これは宿題だと思いますので、割り当てでストリームを確認する必要がある場合は、現在宣言されているメソッドの外でストリームを宣言する必要があります。メソッドで何かを宣言すると、そのメソッドにのみスコープがありますそのため、現在終了ボタン ハンドラーにあるコードはコンパイルすることさえできません。

終了ボタン ハンドラーの if に不足している角かっこ。

于 2010-10-10T00:14:57.337 に答える