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

C#无法在ReadFileFromSftp函数外删除返回的SftpFile对象

问题根因

你遇到的报错本质原因是:Renci.SshNet 库中的 SftpFile 对象强依赖于创建它的 SftpClient 对应的 Sftp 会话,你当前的函数在 finally 块中执行了 sftpClient.Disconnect() 逻辑,会话会被直接销毁,函数返回的 SftpFile 已经失去了可操作的底层会话,外部调用它的 Delete 方法自然会触发已释放对象的报错。而函数内部调用删除时会话还未断开,所以可以正常执行。

可行解决方案
  • 方案1:新增参数控制是否在方法内删除文件
    直接在方法签名中新增 bool deleteAfterRead 入参,调用方如果需要删除文件直接传 true,删除逻辑放在方法内部会话还存活的阶段执行,不需要把 SftpFile 返回到外部操作。
    示例修改:

    // 方法签名修改
    public (DataTable, string, SftpFile) ReadFileFromSftp(List<string> headers ,InboundFileConfiguration configuration, ILogger logger, bool deleteAfterRead = false)
    // 读取完文件后加逻辑
    if(deleteAfterRead)
    {
        fileToBeRead.Delete();
    }
    
  • 方案2:将SftpClient的生命周期交给调用方管理
    去掉当前方法内的 finally 断连逻辑,把 SftpClient 作为入参传入,或者把该方法封装的类实现 IDisposable 接口,由调用方在完成所有操作(包括外部删除文件)后,再主动断开Sftp连接、释放资源。

  • 方案3:封装独立的删除Sftp文件方法
    不返回 SftpFile 对象,只返回文件路径、文件名等必要元数据,额外封装一个删除Sftp文件的公共方法,接收文件路径作为入参,方法内部会独立创建Sftp连接、执行删除操作后主动断连,外部需要删除时直接调用该方法即可。

额外注意事项

你当前的代码存在空引用风险:当 fileToBeRead == null 时,你仅打印了错误日志,没有提前return,后续执行 fileToBeRead.Delete() 会直接抛出空引用异常,需要补充判空后的跳出逻辑。

内容的提问来源于stack exchange,提问作者Simran Kaur

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 01:51:04