使用SSH.Net下载并返回非阻塞数据流
我正在使用ssh.net库执行SFTP操作以处理大型数据文件( > = 500MB )
我遇到了如何以非阻塞方式返回数据的问题。
ftpClient.DownloadFile()
方法签名是正确的,当写入文件或者有某种方式我可以实例化流,但是当我想要在不阻塞的情况下返回流时遇到如何使用它的问题。
到目前为止我看到的所有示例都是将下载文件写入文件流。 什么都不会只返回一个流
使用.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
除外),它可以用于大文件?
这是一个老问题,但我有类似的问题。 如果要直接获取流,可以写入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);