Проблема SaveFileDialog (C #) (VS2008) - PullRequest
1 голос
/ 29 апреля 2010

У меня возникла проблема с SaveFileDialog по некоторым причинам. Все, что я хочу сделать, это извлечь данные из текстового поля построчно и записать их в текстовый файл, а затем сохранить этот текстовый файл на рабочем столе. Первый фрагмент кода работает нормально (хотя и не сохраняется на рабочем столе). Второй фрагмент кода - это то, что я хочу использовать, но когда он создает текстовый файл, текстовый файл становится пустым. Что я сделал не так во втором бите кода?

Этот код работает, но он не сохраняется на рабочем столе и не так хорош, как второй код.

//When the Save button is clicked the contents of the text box will be written to a text file.
private void saveButton_Click(object sender, EventArgs e)
{
    int textBoxLines = textBox.Lines.Count();
    if (File.Exists(saveFile))
    {
        result = MessageBox.Show("The file " + saveFile + " already exists.\r\nDo you want to replace it?", "File Already Exists!", MessageBoxButtons.YesNo);

        if (result == DialogResult.Yes)
        {
            TextWriter tw1 = new StreamWriter(saveFile);
            for (int i = 0; i < textBoxLines; i++)
            {
                tw1.WriteLine(textBox.Lines.GetValue(i));
            }

            tw1.Close();

        }

        if (result == DialogResult.No)
        {
            MessageBox.Show("Please move or rename existing " + saveFile + "\r\nBefore attempting to save again.", "Message");
        }
    }

    else
    {
        TextWriter tw2 = new StreamWriter(saveFile);
        for (int i = 0; i < textBoxLines; i++)
        {
            tw2.WriteLine(textBox.Lines.GetValue(i));
        }

        tw2.Close();

    }

}

Этот код не работает, но это то, что я хочу использовать.

//When the Save button is clicked the contents of the text box will be written to a text file.
private void saveButton_Click(object sender, EventArgs e)
{
    int textBoxLines = textBox.Lines.Count();

    Stream saveStream;
    SaveFileDialog saveDialog = new SaveFileDialog();
    saveDialog.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
    saveDialog.FilterIndex = 2;
    saveDialog.RestoreDirectory = true;
    saveDialog.FileName = (saveFile);
    saveDialog.InitialDirectory = (Environment.GetFolderPath(Environment.SpecialFolder.Desktop));

    if (saveDialog.ShowDialog() == DialogResult.OK)
    {
        if ((saveStream = saveDialog.OpenFile()) != null)
        {
            StreamWriter tw = new StreamWriter(saveStream);
            for (int i = 0; i < textBoxLines; i++)
            {
                tw.WriteLine(textBox.Lines.GetValue(i));
            }

            saveStream.Close();
        }
    }
}

Ответы [ 2 ]

4 голосов
/ 29 апреля 2010

У вас нет tw.Close() после написания содержимого. Буфер не будет очищен.

3 голосов
/ 29 апреля 2010

Как отметил ChrisF, вы никогда не закрываете SteamWriter. Тем не менее, рекомендуется иметь using блоки для их закрытия / утилизации.

//When the Save button is clicked the contents of the text box will be written to a text file.
private void saveButton_Click(object sender, EventArgs e)
{
    int textBoxLines = textBox.Lines.Count();

    SaveFileDialog saveDialog = new SaveFileDialog();
    saveDialog.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
    saveDialog.FilterIndex = 2;
    saveDialog.RestoreDirectory = true;
    saveDialog.FileName = (saveFile);
    saveDialog.InitialDirectory = (Environment.GetFolderPath(Environment.SpecialFolder.Desktop));

    if (saveDialog.ShowDialog() == DialogResult.OK)
    {
        using (Stream savestream = saveFialog.OpenFile())
        {

            if (saveStream != null)
            {
                using(StreamWriter tw = new StreamWriter(saveStream))
                {

                    for (int i = 0; i < textBoxLines; i++)
                    {
                        tw.WriteLine(textBox.Lines.GetValue(i));
                    }
                }
            }
        }
    }
}
...