使用 SSH.Net 下载并返回非阻塞数据流

use*_*426 6 c# streaming sftp ssh.net

我正在使用ssh.net 库执行 SFTP 操作来处理大型数据文件(>=500MB

我遇到了如何以非阻塞方式返回数据的问题。

当写入文件时或者如果有某种方法可以实例化流时,方法ftpClient.DownloadFile()签名是可以的,但是当我想在不阻塞的情况下返回流时,我在如何使用它方面遇到了问题。

到目前为止我看到的所有示例都将下载内容写入Filestream. 没有什么只是返回流

使用 .Net 的内置 FTP,您只需使用response.GetResponseStream(),它就会无阻塞地传回数据。

在 return 语句中使用它的唯一方法是写入临时文件。但这会导致它成为阻塞操作。

        var tmpFilename = "temp.dat";
        int bufferSize = 4096;
        var sourceFile = "23-04-2015.dat";

        using (var stream = System.IO.File.Create(tmpFilename , bufferSize, System.IO.FileOptions.DeleteOnClose))
        {
            sftpClient.DownloadFile(sourceFile, stream);
            return stream;
        }
Run Code Online (Sandbox Code Playgroud)

我不希望它阻塞,而是流回数据。

我还想避免创建临时文件。

是否有其他实现可以使其流回数据?

或者是否有一个可以实例化的替代流(除了MemoryStream),可以处理大文件?

小智 4

这是老问题,但我有类似的问题。如果你想直接获取流,你可以写入MemoryStream。

SftpClient _sftpClient;
_sftpClient = new SftpClient("sftp.server.domain", "MyLoginHere", "MyPasswordHere");
Stream fileBody = new MemoryStream();
_sftpClient.DownloadFile(ftpFile.FullName, fileBody);
fileBody.Position = 0; //dont forget to set the stream position back to beginning
Run Code Online (Sandbox Code Playgroud)

如果你想下载文件,你可以在单独的线程中或作为异步调用,然后调用委托:

_sftpClient.DownloadFile(ftpFile.FullName, fileBody, YourActionDelegateHere);
Run Code Online (Sandbox Code Playgroud)

  • 这对于小文件来说可能没问题,但它的性能是最低的,因为您没有利用缓冲...对于大文件,您将得到“OutOfMemoryException”。 (2认同)