You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 15:57:31