运行时发生异常时FileStream无法关闭,如何解决?
解决运行时异常导致FileStream无法关闭的问题
你的问题核心是FileStream没有被正确托管释放,一旦中间抛出异常,代码没机会执行Close(),且catch块也访问不到这个局部变量,导致文件句柄一直被占用。解决方法很简单,用using语句包裹FileStream,它会自动帮你处理资源释放,不管有没有异常。
修改后的代码如下:
try { using (ExcelEngine excelEngine = new ExcelEngine()) { // ... 其他代码 ... var path = Path.Combine(Directory.GetCurrentDirectory(), @"wwwroot\Data\Temp", userId + ".xlsx"); // 用using包裹FileStream,自动释放资源 using (FileStream inputStream = new FileStream(path, FileMode.Open)) { // ... 读取Excel的代码 ... // 即使这里发生异常,using也会自动调用inputStream.Dispose()(内部包含Close逻辑) } // ... 其他代码 ... } } catch(Exception ex) { // ... 异常处理逻辑 ... }
为什么这样可行?
using语句是语法糖,会被编译成try-finally块,确保代码块结束(无论正常执行还是抛出异常)时,都会调用对象的Dispose()方法。而FileStream的Dispose()会自动关闭文件流并释放占用的系统资源,无需手动调用Close()。
如果觉得嵌套using不够简洁,也可以将多个对象放在同一层using中(用逗号分隔),嵌套写法可读性会更好:
using (ExcelEngine excelEngine = new ExcelEngine()) using (FileStream inputStream = new FileStream(path, FileMode.Open)) { // ... 业务代码 ... }
这样就能彻底解决异常时文件流无法关闭的问题,不用再重启服务器。
内容的提问来源于stack exchange,提问作者Alex Wright
相关产品推荐
相关产品推荐

