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

