我使用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
除外),它可以用于大文件?
答案 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)
。这将允许您直接处理流式数据。