表单退出时关闭流读取和流编写器

时间:2010-10-09 21:47:32

标签: c# winforms streamreader streamwriter

嘿伙计们,这里有点麻烦。

所以我有一个加载按钮来加载文件,还有一个保存按钮来保存文件。我还有一个关闭程序的退出按钮。我需要帮助的是当我关闭程序时,我不会检查是否有任何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设置为top,然后当Stream Reader或Writer关闭时,将bool值设置为true,因此当我退出应用程序时,如果它仍设置为false,则会关闭它们反正。

但这不起作用,因为isDirtyBoolean值是那些私有的void按钮,我无法得到它们。

3 个答案:

答案 0 :(得分: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语句的候选者。


请记住要注意MSDN文档中的警告,如下所示:

<强> StreamWriter.Dispose always closes stream

  

StreamWriter.Dispose始终关闭   stream关闭StreamWriter   它的基础流   处置,即使你使用了   你明确的构造函数   提供流。有时你想要   保持流开放,但这   class目前不提供   这样做的机制,除非没有   呼叫处理,但一定要打电话   请改为冲洗。

答案 1 :(得分:1)

首先,你正在关闭你的流 - 虽然我会使用“using”语句来确保它们即使有异常也会被关闭。因此在表单退出时无需关闭它们。

这也是错误的编码:

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

您的if条件仅适用于第一个语句。你需要在if之后加上大括号。

答案 2 :(得分:1)

使用“使用”或编写自己的try / catch / finally块并在finally中关闭流。

我假设这是作业,所以如果你的作业要求你检查你的流,你必须在他们当前声明的方法之外声明你的流。当你在方法中声明某些东西它只有范围在该方法中,所以当前在退出按钮处理程序中的代码甚至不应该编译。

你的退出按钮处理程序中的if上缺少括号。