【问题标题】:How to abort an Action from SftpClient class' DownloadFile() function (SSH.NET)?如何从 SftpClient 类的 DownloadFile() 函数 (SSH.NET) 中止操作?
【发布时间】:2018-04-09 16:48:11
【问题描述】:

我正在使用SSH.NET 通过安全的SSH/SFTP 连接实现文件下载。我还需要能够看到下载的进度,并能够在用户需要时中止它。所以代码看起来像这样:

ConnectionInfo conn = new PasswordConnectionInfo(host, port, username, password);
SftpClient sshSFTP = new SftpClient(conn);
sshSFTP.Connect();

try
{
    FileStream streamFile = File.Create(strLocalFilePath);

    sshSFTP.DownloadFile(strFilePath, streamFile,
        (ulong uiProcessedSize) =>
        {
            //Callback
            processProgress(uiProcessedSize);

            if(didUserAbortDownload())
            {
                //Aborted
                throw new Exception("Aborted by the user");
            }
        });
}
catch (Exception ex)
{
    Console.WriteLine("Download failed: " + ex.Message);
}

streamFile.Close();
sshSFTP.Disconnect();

我找不到任何记录方法来中止 DownloadFile 方法的 Action 回调函数,所以我求助于抛出异常。

但是这种方法的问题是我的自定义异常没有被捕获。

知道如何解决这个问题吗?

【问题讨论】:

    标签: c# .net ssh sftp ssh.net


    【解决方案1】:

    您可以使用他们的异步(尽管not true async)流,即BeginDownloadFile。该方法返回的IAsyncResult 实现SftpDownloadAsyncResult 通过其IsDownloadCanceled 属性公开取消。

    【讨论】:

    • 谢谢。我能够使用您在此处的提示整理一个方法来报告进度并处理 Renci SSH 上传和下载的取消。
    【解决方案2】:

    除了使用异步接口,正如@ejohnson 所建议的那样,您还可以关闭输出流:

    try
    {
        FileStream streamFile = File.Create(strLocalFilePath);
    
        sshSFTP.DownloadFile(strFilePath, streamFile,
            (ulong uiProcessedSize) =>
            {
                //Callback
                processProgress(uiProcessedSize);
    
                if(didUserAbortDownload())
                {
                    //Aborted
                    streamFile.Close();
                }
            });
    }
    catch (Exception ex)
    {
        if(didUserAbortDownload())
        {
            Console.WriteLine("Download cancelled");
        }
        else
        {
            Console.WriteLine("Download failed: " + ex.Message);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-02-10
      • 2018-07-19
      • 1970-01-01
      • 2020-01-09
      • 2019-08-20
      • 2010-11-18
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      相关资源
      最近更新 更多