删除文件报文件正由另一进程使用的问题(请看了具体内容再回复,谢谢)

cxm0624 2020-06-22 03:06:23
开发的网站,有一个上传zip包并解压,解压后再删除上传的zip包功能,现在发生的情况是原先的服务器出了问题,换了台服务器,功能正常使用几个小时后,就会报文件正由另一进程使用的问题,这时不改代码,重新把dll文件更新一下就又正常了,当然重启一下IIS或回收一下应用程序池也可以解决,经过分析,发现问题出现在删除zip包这里,但我在读取文件时采用的是
FileStream fsZip = new FileStream(sourceFile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
然后在最后把文件解压完了后还写了
fsZip.Close();
fsZip.Dispose();
按理说不应该出现这种情况,而且这种情况不是一直有,是正常了几个小时后才发生,所以弄得都不知道是怎么回事,应该如何解决了
在这里请教一下各位,谢谢了
...全文
13617 点赞 收藏 6
写回复
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
闭包客 2020-06-24
如果你确认你的 Close 或者 Dispose 函数被执行了,那么就像提示所说的那样,文件是由另外的进程或者线程占用的。 你应该检查服务器上有什么其他的程序会占用这个文件,也许一个新增加的文件会被安全软件扫描也不一定。
回复
libolei 2020-06-24
using using
回复
圣殿骑士18 2020-06-24
同意。先改using,观察看看。 using的原理是try catch,也就是有异常了,它会保证你资源一定被释放。而你手工去Close和Dispose没这种保证,比如你前面的代码异常了,后面的Close并不会被执行。 如果这么推理的话,有可能你代码执行中间,可能出现过异常。你们有没有系统日志可以查到所有报告的异常?
回复
养成习惯写 using(){....} 结构代码比较可靠。
回复
LZ贴一下你删除的代码呢? 你这块的代码都贴下看看
回复
datafansbj 2020-06-22
这种问题是执行环境引起的,因此不是每次都报错。具体来说就是某种场景下文件没有完全关闭,所以删除时会报错。
1、使用 try...finally,把关闭的语句放在 finally 中,确保即使异常也能关闭文件
2、使用 using()结构,保证文件流在离开 using 后会自动关闭
3、如果不对文件做修改操作,应使用只读模式打开
4、文件关闭后 sleep 几毫秒,然后再删除,或许有改善作用
回复
相关推荐
发帖
C#
创建于2007-09-28

10.6w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2020-06-22 03:06
社区公告

让您成为最强悍的C#开发者