System.IO.IOException异常:重复上传Excel文件时文件被占用问题排查
问题排查与修复方案
异常原因
- 重复使用同一文件名:每次上传都写入到固定路径的
Excel.xlsx文件,第一次上传后该文件可能被系统进程(如杀毒软件、文件索引服务)或未完全释放的流占用,第二次上传时无法打开同一路径的文件。 - 不必要的手动关闭流:代码中手动调用
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
相关产品推荐
相关产品推荐

