Закрытие Stream Read и Stream Writer при выходе из формы - PullRequest
1 голос
/ 10 октября 2010

Эй, ребята, у меня возникли небольшие проблемы.

Итак, у меня есть кнопка загрузки, которая загружает файл, и кнопка сохранения, чтобы сохранить файл.У меня также есть кнопка выхода, которая закрывает программу.Что мне нужно помочь, так это когда я закрываю программу, я не проверяю, есть ли какие-либо вещи 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 - это те частные кнопки void, и я не могу получить к ним доступ.

Ответы [ 3 ]

2 голосов
/ 10 октября 2010

Чтобы лучше следить за вещами в целом, закройте своих читателей и писателей тем же способом, которым вы их открываете, вместо того, чтобы позволить им жить в течение всего срока действия приложения.

Если вы используете 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 всегда закрывает поток

StreamWriter.Dispose всегда закрывает поток. Удаление StreamWriter закрывает базовый поток при его удалении, даже если вы используете конструктор, в котором вы явно предоставляете поток.Иногда вы хотите оставить поток открытым, но этот класс в настоящее время не предоставляет механизм для этого, за исключением того, что он не вызывает Dispose, но вместо этого обязательно вызовите Flush.

1 голос
/ 10 октября 2010

Используйте «использование» или напишите свои собственные блоки try / catch / finally и закройте свои потоки в finally.

Я предполагаю, что это домашнее задание, поэтому, если ваше задание требует от вас проверки потоков, которые вывам придется объявлять ваши потоки вне методов, в которых они в настоящее время объявлены. Когда вы объявляете что-то в методе, у него есть только область действия в этом методе, поэтому код, который в данный момент находится в вашем обработчике кнопки выхода, даже не должен компилироваться.*

ваши пропущенные скобки в вашем if в вашем обработчике кнопки выхода.

1 голос
/ 10 октября 2010

Прежде всего, вы правильно закрываете свои потоки - хотя я бы использовал выражение «using», чтобы убедиться, что они закрыты, даже если есть исключение.Поэтому нет необходимости закрывать их при выходе из формы.

Также это неверное кодирование:

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

Ваше условие if работает только для первого оператора.Вам нужно поставить фигурные скобки после if.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...