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

时间:2015-04-23 07:40:54

标签: c# streaming sftp ssh.net

我使用ssh.net library执行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;
        }

我不希望它阻止但要回流数据。

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

是否有替代实现使其回流数据?

或者是否有我可以实例化的替代流(MemoryStream除外),它可以用于大文件?

2 个答案:

答案 0 :(得分:0)

这是一个老问题,但我有类似的问题。 如果您想直接获取流,可以写入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

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

_sftpClient.DownloadFile(ftpFile.FullName, fileBody, YourActionDelegateHere);

答案 1 :(得分:0)

多年后,我遇到了同样的问题,我花了比我愿意承认的时间更长的时间才弄清楚。这是最热门的搜索结果之一,所以这里有一个实际的答案:事实证明 SSH.NET 确实公开了一个 SftpFileStream,只是使用了不同的方法,如果您正在寻找“下载”,您可能看不到这些方法.使用 sftpClient.DownloadFile(sourceFile, stream) 代替 sftpClient.OpenRead(sourceFile)。这将允许您直接处理流式数据。