我正在尝试将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();
}
}
}
答案 0 :(得分:5)
Jeagr,
当我尝试使用您的第一个示例代码重新创建问题时,我没有任何问题。如果我猜测,你可能会遇到内存分配问题(使用非托管资源)以及多次调试尝试,并且可能一遍又一遍地重新保存到同一个文件可能会留下错误的文件指针。
你的第二个例子不起作用。当您调用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);
}
}
}
答案 1 :(得分:1)
虽然我不使用C#而是使用C ++,但我遇到了这个问题(即对话框根本没有出现)。通过清零整个OPENFILENAME结构来解决它,然后填充我只需要的成员。事实上,在调用常见对话框之前,不对结构进行归零也是打印对话框的一个问题。
答案 2 :(得分: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);
}