问题描述
我正在使用 ssh.net库来执行SFTP操作,以处理大型数据文件(> = 500MB )
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.
ftpClient.DownloadFile()
方法签名是可以的,当写入文件或可以通过某种方式实例化流时,但是当我想返回流而不阻塞时,如何使用它存在问题.
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.
到目前为止,我所看到的所有示例都将下载内容写入到Filestream
中.没有什么可以返回流
All the examples I have seen so far will be writing the download to a Filestream
. Nothing that just returns a stream
使用.Net的内置FTP,您只需使用response.GetResponseStream()
,它就可以不阻塞地流回数据.
With .Net's built-in FTP, you just use response.GetResponseStream()
, and it streams back the data, without blocking.
在return语句中使用它的唯一方法是写入临时文件.但这导致它是阻塞操作.
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?
或者是否有我可以实例化的替代流(MemoryStream
除外),该流适用于大文件?
Or is there an alternative stream I can instantiate(except for MemoryStream
), that would work with large files?
推荐答案
这是个老问题,但我遇到了类似的问题.如果要直接获取流,则可以写入MemoryStream.
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);
这篇关于使用SSH.Net下载并返回非阻塞数据流的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!