WinForms程序报错:文件被另一进程占用,求解决方案
问题分析与解决方案
错误根源
你的问题不是OpenFileDialog未关闭,而是保存现有文件的代码里存在重复操作文件的冲突:
在button2_Click的else分支中,你同时使用了StreamWriter和File.WriteAllText操作同一个文件:
StreamWriter existingFileSave = new StreamWriter(filePath, false)已经以覆盖模式打开了文件- 紧接着调用
File.WriteAllText(filePath, String.Empty)会再次尝试打开同一个文件,此时文件已经被StreamWriter占用,因此抛出文件被占用的异常。
另外,StreamWriter的第二个参数传false时,本身就会清空原文件内容并写入新数据,不需要额外调用File.WriteAllText清空。
修正后的代码
1. 「打开」按钮代码(无需修改,本身是正确的)
public void button1_Click(object sender, EventArgs e) { if (openFileDialog1.ShowDialog() == DialogResult.OK) { using (Stream stream = openFileDialog1.OpenFile()) { using (StreamReader reader = new StreamReader(stream)) { textBox1.Text = reader.ReadToEnd(); } } } }
2. 「保存」按钮修正代码
// 建议在窗体构造函数或InitializeComponent里初始化saveFileDialog1,不需要每次点击都new // 比如在窗体类里声明:private SaveFileDialog saveFileDialog1 = new SaveFileDialog(); public void button2_Click(object sender, EventArgs e) { string filePath = openFileDialog1.FileName; if (string.IsNullOrEmpty(filePath)) { if (saveFileDialog1.ShowDialog() == DialogResult.OK) { using (StreamWriter saveStream = new StreamWriter(saveFileDialog1.FileName, false)) { saveStream.Write(textBox1.Text); } // 保存成功后更新openFileDialog1的FileName,下次直接保存到该路径 openFileDialog1.FileName = saveFileDialog1.FileName; } } else { // 直接用StreamWriter覆盖写入,无需额外清空操作 using (StreamWriter existingFileSave = new StreamWriter(filePath, false)) { existingFileSave.Write(textBox1.Text); } } }
额外优化建议
- 避免每次点击保存按钮都实例化
SaveFileDialog,可以在窗体初始化时创建一次,复用实例。 - 保存新文件成功后,更新
openFileDialog1.FileName,这样下次保存可以直接写入该文件,无需再次选择。
内容的提问来源于stack exchange,提问作者Tumbleweed64
相关产品推荐
相关产品推荐

