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

System.IO.IOException异常:重复上传Excel文件时文件被占用问题排查

问题排查与修复方案

异常原因

  1. 重复使用同一文件名:每次上传都写入到固定路径的Excel.xlsx文件,第一次上传后该文件可能被系统进程(如杀毒软件、文件索引服务)或未完全释放的流占用,第二次上传时无法打开同一路径的文件。
  2. 不必要的手动关闭流:代码中手动调用file.Close(),但using var声明已经会在代码块结束时自动释放文件流,手动关闭可能导致流状态异常,增加文件未及时释放的概率。

代码修改方案

方案1:生成唯一文件名(推荐)

给每个上传的文件生成唯一名称,避免路径冲突,同时保留原文件名信息:

// 生成唯一文件名,避免重复占用
var uniqueFileName = $"{Path.GetFileNameWithoutExtension(args.File.Name)}_{Guid.NewGuid()}{Path.GetExtension(args.File.Name)}";
var tempFilePath = Path.Combine(Path.GetTempPath(), uniqueFileName);

using var file = File.OpenWrite(tempFilePath);
await args.File.OpenReadStream().CopyToAsync(file);
// 移除手动Close(),using会自动处理流释放
var file1 = new FileInfo(tempFilePath);

方案2:强制覆盖并确保流释放

如果必须使用原文件名,可先检查文件是否存在,删除后再写入,同时移除手动Close():

var tempFilePath = Path.Combine(Path.GetTempPath(), args.File.Name);

// 若文件存在则先删除
if (File.Exists(tempFilePath))
{
    File.Delete(tempFilePath);
}

using var file = File.OpenWrite(tempFilePath);
await args.File.OpenReadStream().CopyToAsync(file);
var file1 = new FileInfo(tempFilePath);

关键说明

  • using var是C# 8.0+的语法,会在当前作用域结束时自动调用Dispose()释放文件流,无需手动调用Close(),手动调用可能导致流提前关闭引发其他问题。
  • 使用唯一文件名是最稳妥的方式,避免同一文件被多次上传时的冲突问题,也能防止多用户场景下上传文件互相覆盖。

内容的提问来源于stack exchange,提问作者Paul T. Rykiel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 04:24:59