2

我正在尝试将 SaveFileDialog 添加到我的 Windows 应用程序中,在其中我从多行文本框的内容中保存一个简单的文本文件。该程序似乎在保存对话框之前工作正常,并且我没有收到任何错误,但是一旦我单击保存按钮,应用程序就会挂起。唯一的出路是单击“停止调试”按钮。以下是我尝试过的代码部分,但都创建了相同的挂起:

private void button_SaveToFile_Click(object sender, EventArgs e)
    {
        SaveFileDialog saveFileDialog1 = new SaveFileDialog();
        saveFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";            
        saveFileDialog1.RestoreDirectory = true;

        if (saveFileDialog1.ShowDialog() == DialogResult.OK)
        {
               File.WriteAllText(saveFileDialog1.FileName, textBox_ListDestination.Text);
        }            
    }

private void button_SaveToFile_Click(object sender, EventArgs e)
    {
        Stream myStream;
        SaveFileDialog saveFileDialog1 = new SaveFileDialog();

        saveFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
        saveFileDialog1.FilterIndex = 2;
        saveFileDialog1.RestoreDirectory = true;

        if (saveFileDialog1.ShowDialog() == DialogResult.OK)
        {
            if ((myStream = saveFileDialog1.OpenFile()) != null)
            {
                File.WriteAllText(saveFileDialog1.FileName, textBox_ListDestination.Text);
                myStream.Close();
            }
        }
    }
4

3 回答 3

7

耶格尔,

当我尝试使用您的第一个示例代码重新创建问题时,我没有任何问题。如果我猜的话,您可能会遇到内存分配问题(使用非托管资源)以及多次调试尝试,并且可能一遍又一遍地重新保存到同一个文件可能会留下一个错误的文件指针。

你的第二个例子不起作用。当您调用 File.WriteAllText 时,它会自动为您打开、写入和关闭文件。(在这里阅读:http: //msdn.microsoft.com/en-us/library/system.io.file.writealltext.aspx

当您调用 OpenFile 时,您将锁定该文件。在您的代码中,当执行 File.WriteAllText 时,它会爆炸,因为该文件已在使用中。如果您想使用 OpenFile 处理文件,则必须更改处理文件的方式。这是一个示例: http: //msdn.microsoft.com/en-us/library/system.windows.forms.savefiledialog.openfile (v=VS.71).aspx 如果需要,请注意示例如何关闭文件要在文件中工作,您需要在调用 CloseFile 方法之前编写该工作的代码。

如果您想了解如何使用 OpenFile 处理文件的示例,互联网上应该有几个示例,但根据您的需要,我认为 File.WriteAllText 会起作用。

回到第一个例子。

如果您在调试期间多次点击代码,我唯一的建议是将 SaveFileDialog 包装在“使用”语句中。这可能有助于系统挂起和一些调试。

private void button1_Click(object sender, EventArgs e)
    {
        using (var sfd = new SaveFileDialog())
        {
            sfd.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
            sfd.FilterIndex = 2;

            if (sfd.ShowDialog() == DialogResult.OK)
            {
                File.WriteAllText(sfd.FileName, textBox_ListDestination.Text);
            }     
        }
    }
于 2013-01-22T01:49:04.047 回答
1

虽然我不使用 C# 而是 C++,但我遇到了这个问题(即根本没有出现对话框)。通过将整个 OPENFILENAME 结构归零,然后填写我只需要的成员来解决它。事实上,在调用通用对话框之前不将结构归零也是打印对话框的一个问题。

于 2013-01-22T00:16:46.447 回答
0

我最终使用下面的代码来让它工作。代码“ShowHelp = true”是解决问题的原因,然后稍微优化导致以下解决方案:

private static void SaveToFile(string List)
{
    var saveFileDialog1 = new SaveFileDialog
    {
       InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Personal),
       Filter = string.Format("{0}Text files (*.txt)|*.txt|All files (*.*)|*.*", "ARG0"),
       RestoreDirectory = true,
       ShowHelp = true,
       CheckFileExists = false
     };
     if (saveFileDialog1.ShowDialog() == DialogResult.OK)
        File.WriteAllText(saveFileDialog1.FileName, keywordList);
}
于 2013-02-15T01:26:31.043 回答