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

C# 调用File.Create创建文件后写入提示文件被其他进程占用如何解决

问题原因
  • 核心触发点:File.Create()方法执行后会返回一个处于打开状态的FileStream对象,代码中没有对该对象做释放处理,系统会一直持有该文件的访问句柄,后续File.WriteAllText尝试访问同一文件时就会抛出占用报错。
  • 冗余操作:File.WriteAllText原生支持自动创建不存在的目标文件,提前调用File.Create()本身属于多余操作。
解决方法

方案1(推荐):直接删除File.Create调用

完全不需要提前创建文件,File.WriteAllText会自动处理文件创建逻辑,同时建议优化路径拼接逻辑,避免手动拆分用户名出现异常,修改后代码如下:

string[] name = file.Split('.');
HttpWebRequest FileRequest = (HttpWebRequest)WebRequest.Create(URL + name[0] + ".html");
FileRequest.UserAgent = "FSL File Getter Agent";

// 用系统原生方法获取用户目录,兼容性更强
string userPath = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
string targetFilePath = Path.Combine(userPath, "FSL", Item, file);

using (HttpWebResponse response = (HttpWebResponse)FileRequest.GetResponse())
using (Stream stream = response.GetResponseStream())
using (StreamReader reader = new StreamReader(stream))
{
    File.WriteAllText(targetFilePath, reader.ReadToEnd());
}

方案2:显式释放File.Create返回的流

如果业务逻辑确实需要提前创建文件,必须手动释放File.Create返回的文件流,两种可行写法如下:

// 写法1:用using语法自动释放流
using (File.Create(targetFilePath))
{
    // 无需额外逻辑,using代码块结束后会自动释放文件句柄
}
File.WriteAllText(targetFilePath, reader.ReadToEnd());

// 写法2:直接调用Dispose方法释放
File.Create(targetFilePath).Dispose();
File.WriteAllText(targetFilePath, reader.ReadToEnd());

内容的提问来源于stack exchange,提问作者Master16

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 22:06:04