我试图将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);
}
}
Run Code Online (Sandbox Code Playgroud)
和
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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
耶格
当我尝试使用第一个示例代码来重新创建问题时,我没有任何问题。如果我猜到了,您可能在内存分配(使用非托管资源)上遇到了问题,并且尝试了多次调试,并且可能一遍又一遍地重新保存到同一文件中可能会留下错误的文件指针。
您的第二个示例不起作用。调用File.WriteAllText时,它将自动为您打开,写入和关闭文件。(在这里阅读:http : //msdn.microsoft.com/en-us/library/system.io.file.writealltext.aspx)
调用OpenFile时,您正在对该文件进行锁定。在您的代码中,执行File.WriteAllText时,由于文件已在使用中,因此会炸毁。如果要使用OpenFile处理文件,则必须更改处理文件的方式。这是一个示例:http : //msdn.microsoft.com/zh-cn/library/system.windows.forms.savefiledialog.openfile(v=VS.71).aspx 请注意该示例如何关闭文件(如果需要)要在文件中进行工作,您需要在调用CloseFile方法之前对该工作进行编码。
如果您想要一个有关如何使用OpenFile处理文件的示例,那么互联网上应该有几个示例,但是根据您的需要,我认为File.WriteAllText可以使用。
回到第一个例子。
如果在调试过程中多次击中代码,我的唯一建议是将SaveFileDialog包裹在“ using”语句中。这可能有助于系统挂起和进行一些调试。
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)