4

我正在使用ssh.net 库来执行 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),它适用于大文件?

4

2 回答 2

3

这是老问题,但我有类似的问题。如果要直接获取流,可以写入 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);
于 2017-10-24T09:51:08.220 回答
0

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

于 2021-02-20T04:40:14.950 回答