2015-04-23 39 views
1

我现在用的是ssh.net library进行SFTP操作与大型数据文件的工作数据的非阻塞流(> = 500MB下载和使用返回SSH.Net

我有怎样的问题以非阻塞的方式返回数据。

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

下载是在哪个协议(如:HTTP,TCP) ? –

+0

我没有得到你的质疑。 TCP如何进来,因为它是一个非应用程序协议....不要以为通过HTTP的SFTP这样的东西....但它是通过端口22的SFTP。 – user919426

+0

我以为你想先下载SFTP到您的应用程序(可能在WPF或ASP.NET中)。但下载是直接的,对吧? –

回答

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); 
+0

这对小文件来说可能没问题,但是由于你没有使用缓冲,所以它的性能最差......你将为大文件获得'OutOfMemoryException's。 – user919426