SSH.NET实现SFTP递归下载时二次触发File.Create报文件占用异常如何解决
问题排查与修复方案
以下是可直接落地的修复步骤:
- 检查
DownloadProgressBar回调逻辑:确认该回调中没有操作目标本地文件的代码,如果存在读写目标文件的操作,必须用using封装流操作,用完立即释放资源。 - 优化本地文件创建逻辑:原代码直接调用
File.Create覆盖已有文件,改为创建前先清理旧文件,同时指定文件流的独占模式,避免残留句柄影响:
// 替换原有的File.Create逻辑 if (File.Exists(destFilePath)) { File.Delete(destFilePath); } using (Stream fileStream = new FileStream(destFilePath, FileMode.CreateNew, FileAccess.Write, FileShare.None))
- 修正取消逻辑的资源泄漏问题:原代码触发取消时直接断开SFTP连接并返回,会导致当前正在传输的文件流来不及被
using自动释放,建议修改为中断当前传输后再退出,同时在取消逻辑、方法结束位置增加强制GC清理兜底:
// 方法末尾或取消逻辑return前添加 GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect();
- 调整SftpClient生命周期:不要复用同一个SftpClient实例执行多次下载任务,每次点击下载按钮新建独立的SftpClient实例,下载完成后主动调用
Dispose()释放客户端内部持有的所有资源。 - 可选兜底方案:如果上述修改后仍偶现占用,可在创建文件流时增加重试逻辑,捕获占用异常后等待几十毫秒再重试,最多重试3-5次,兼容本地杀毒软件、索引服务临时占用文件的场景。
内容的提问来源于stack exchange,提问作者buradd
相关产品推荐
相关产品推荐

