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
相关产品推荐
相关产品推荐

