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

如何在WinSCP中使用Session.PutFile函数验证文件传输成功并基于内存Stream处理文件?

如何检查WinSCP Session.PutFile的传输成功状态并使用内存Stream传输

1. 利用异常捕获判断传输结果

Session.PutFile虽然没有返回值,但WinSCP在传输过程中如果出现任何错误(比如网络中断、权限不足、磁盘空间不够等),都会抛出SessionException异常。所以我们可以通过try-catch块来捕获异常,以此判断传输是否成功:

  • 如果代码顺利执行完PutFile方法且没有抛出异常,说明传输成功;
  • 如果捕获到SessionException,则说明传输失败,可以在catch块里处理错误逻辑。

2. 结合内存Stream的完整实现示例

下面是一个完整的代码示例,演示如何从内存Stream传输文件到FTP,同时验证传输结果:

using WinSCP;
using System.IO;

// 初始化SessionOptions
var sessionOptions = new SessionOptions
{
    Protocol = Protocol.Ftp,
    HostName = "your-ftp-host.com",
    UserName = "your-username",
    Password = "your-password"
};

bool transferSuccess = false;
string remoteFilePath = "/remote/path/your-file.txt";

// 模拟内存中的文件内容
using var memoryStream = new MemoryStream();
using var writer = new StreamWriter(memoryStream);
writer.WriteLine("这是内存中的文件内容");
writer.Flush();
// 注意:Stream需要回到起始位置,否则PutFile会从当前位置开始读取(此时是末尾,会传输空文件)
memoryStream.Seek(0, SeekOrigin.Begin);

using var session = new Session();
try
{
    session.Open(sessionOptions);
    
    // 调用PutFile传输内存Stream
    session.PutFile(memoryStream, remoteFilePath);
    
    // 可选:额外校验远程文件是否存在且大小匹配(更严谨的确认)
    if (session.FileExists(remoteFilePath))
    {
        var remoteFileInfo = session.GetFileInfo(remoteFilePath);
        if (remoteFileInfo.Length == memoryStream.Length)
        {
            transferSuccess = true;
            Console.WriteLine("文件传输成功,且远程文件校验通过!");
        }
        else
        {
            Console.WriteLine("传输完成,但远程文件大小不匹配!");
        }
    }
    else
    {
        Console.WriteLine("传输完成,但远程文件不存在!");
    }
}
catch (SessionException e)
{
    Console.WriteLine($"文件传输失败:{e.Message}");
}
finally
{
    session.Dispose();
}

// 根据transferSuccess状态执行后续代码
if (transferSuccess)
{
    // 执行后续逻辑
}

关键注意点

  • Stream的位置:在调用PutFile前,一定要将Stream的位置重置到起始处(Seek(0, SeekOrigin.Begin)),否则WinSCP会从当前指针位置开始读取,可能导致传输空文件。
  • 额外校验的必要性:虽然异常捕获能覆盖绝大多数失败场景,但如果遇到一些极端情况(比如传输完成但远程服务器文件丢失),额外检查文件存在性和大小可以进一步确保结果可靠。
  • 资源释放:记得用using语句包裹MemoryStream和Session对象,确保资源被正确释放。

我自己在做类似的文件传输需求时,就是用这种异常捕获+事后校验的组合方式,既保证了代码的简洁性,又能可靠地确认传输结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 06:56:01