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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 21:00:05