Downloading and returning a non blocking stream of data using SSH.Net

别等时光非礼了梦想. 提交于 2019-12-07 15:48:20

问题


I am using the ssh.net library for performing SFTP operations to work with large data files (>=500MB)

I am having an issue with how to return the data in a non-blocking way.

The ftpClient.DownloadFile() method signature is ok, when writing to a file or if there's some way I can instantiate the stream, but am having problems on how to use it when I want to return a stream without blocking.

All the examples I have seen so far will be writing the download to a Filestream. Nothing that just returns a stream

With .Net's built-in FTP, you just use response.GetResponseStream(), and it streams back the data, without blocking.

The only way round to using it in a return statement was writing to a temporarity file. But this results in it being a blocking operation.

        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;
        }

I don't want it to block but to stream back the data.

I also would like to avoid creating a temporary file.

Is there an alternative implementation to make it stream back the data?

Or is there an alternative stream I can instantiate(except for MemoryStream), that would work with large files?


回答1:


This is old question, but I had similar issue. If you want to get the stream directly you can write to 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

If you want to download file, you can make it in separate thread or as asynchronous call and then call the delegate:

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


来源:https://stackoverflow.com/questions/29816812/downloading-and-returning-a-non-blocking-stream-of-data-using-ssh-net

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!