2010-07-21 59 views
6

我正嘗試使用SharpSSH從遠程SFTP服務器獲取文件,並且我想將其作爲流讀取出來。從SharpSSH流式傳輸文件

我發現:

  • Sftp,其中有一個Get方法,它保存到本地文件 - 接近

  • SshStream,這可能會做那種我想要的,但似乎從Sftp脫節,所以我可能必須自己實現SFTP部分(??)

  • ChannelSftp,它實現SFTP方法lik Ëget(String, OutputStream),這似乎是完美的,但它是一個低級別的類,它不是在所有明顯,我怎麼連初始化它

它看起來像如果SftpChannelSftp SftpChannel財產是不是私人的,我可以使用它,一切都將是完美的。但是,如果可能的話,我想盡量避免使用SharpSSH。

我錯過了什麼嗎?

回答

8

我做了一些事情,並進行了測試。嘗試一下,隨時按摩API。

首先,您需要提供一種方法,使您可以利用ChannelSftp方法調用OutputStream而不是目標文件名。如果你不想使用反射來完成它,那麼將這個方法添加到Sftp類並重新編譯SharpSSH。

public void GetWithStream(string fromFilePath, Tamir.SharpSsh.java.io.OutputStream stream) 
{ 
    cancelled = false; 
    SftpChannel.get(fromFilePath, stream, m_monitor); 
} 

接下來,創建了Stream類是與Tamir.SharpSsh.java.io.OutputStream兼容,包裝,如下面的一個:

using System.IO; 
using Tamir.SharpSsh.java.io; 

public class GenericSftpOutputStream : OutputStream 
{ 
    Stream stream; 
    public GenericSftpOutputStream(Stream stream) 
    { 
     this.stream = stream; 
    } 

    public override void Write(byte[] buffer, int offset, int count) 
    { 
     stream.Write(buffer, offset, count); 
    } 

    public override void Flush() 
    { 
     stream.Flush(); 
    } 

    public override void Close() 
    { 
     stream.Close(); 
    } 

    public override bool CanSeek 
    { 
     get { return stream.CanSeek; } 
    } 

    public override long Seek(long offset, SeekOrigin origin) 
    { 
     return stream.Seek(offset, origin); 
    } 

    protected override void Dispose(bool disposing) 
    { 
     base.Dispose(disposing); 

     if (this.stream != null) 
     { 
      this.stream.Dispose(); 
      this.stream = null; 
     } 
    } 
} 

有了這些成分,你現在可以使用OpenSSH以流其數據的您選擇的流,如下面的FileStream所示。

using System.IO; 使用Tamir.SharpSsh;

class Program 
{ 
    static void Main(string[] args) 
    { 
     var host = "hostname"; 
     var user = "username"; 
     var pass = "password"; 
     var file = "/some/remote/path.txt"; 
     var saveas = @"C:\some\local\path"; 

     var client = new Sftp(host, user, pass); 
     client.Connect(); 

     using (var target = new GenericSftpOutputStream(File.Open(saveas, FileMode.OpenOrCreate))) 
     { 
      client.GetWithStream(file, target); 
     } 

     client.Close(); 
    } 
} 
+0

哇。我還沒有嘗試過 - 我希望我錯過了一個API調用 - 但是這看起來可能是我需要做的一部分。現在我只需要Get()到一個文件,但也許以後我會切換到這個。 :-) – Ken 2010-08-03 23:55:30

+0

我知道這是一個老問題,但我在SharpSSH上添加了一些代碼並精簡了一些代碼,我將嘗試在https://bitbucket.org/mattgwagner/sharpssh中對其進行修補。謝謝!! – MattGWagner 2011-04-19 15:26:33

+0

@Matt - 太棒了!感謝您的提拔和好評。 – kbrimington 2011-04-20 15:07:10