2010-07-21 31 views
6

Uzak SFTP sunucusundan dosya almak için SharpSSH kullanmaya çalışıyorum ve bunu bir akış olarak okumak istiyorum. Yerel bir dosyaya kaydeder bir Get yöntemi vardırSharpSSH'den bir dosya akışı

  • sınıf Sftp, - ne istiyorum tür yapabilir yakın

  • sınıf SshStream, fakat:

    buldum Sftp'dan ayrılır gibi görünüyorum, bu yüzden SFTP parçalarını benimsemek zorundayım (SF)

  • sınıf ChannelSftp bu düşük seviyeli sınıf var ve bu hiç bariz bana bile örneğini nasıl değil dışında mükemmel görünüyor e get(String, OutputStream),

görünüyor Sftp 'ın ChannelSftp SftpChannel özelliği özel değilse, olabilir gibi Bunu kullan ve her şey mükemmel olurdu. Mümkünse SharpSSH'yi korsanlıktan kaçınmak istiyorum.

Bir şey mi eksik?

cevap

8

Bir şey üzerinde çalıştım ve test ettim. Bir deneyin ve API'ye masaj yapmaktan çekinmeyin.

Öncelikle, hedef dosya adları yerine OutputStream s'yi çağıran ChannelSftp yöntemlerinden yararlanmanızı sağlayan bir yöntemi karşılamanız gerekir. Bunu yapmak için yansıma kullanmak istemiyorsanız, Sftp sınıfına bu yöntemi ekleyin ve SharpSSH'yi yeniden derleyin. Şimdi olan veri akışı için OpenSSH kullanabilir, bu maddeler ile

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; 
     } 
    } 
} 

:

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

sonra, Aşağıdaki gibi Tamir.SharpSsh.java.io.OutputStream uyumlu Stream sınıfı için bir sarım oluşturmak FileStream ile gösterildiği gibi, seçtiğiniz akış. System.IO kullanarak

; Tamir.SharpSsh kullanarak ;

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

Vay. Henüz denemedim - Kaçırdığım bir API çağrısı yapmayı umuyordum - ama bu benim yapmam gereken şeyin bir parçası gibi görünüyor. Şimdilik sadece bir dosyaya Get() yapacağım ama belki daha sonra buna geçeceğim. :-) – Ken

+0

Bu eski bir soru olduğunu biliyorum, ama ben SharpSSH ve bit düzene bir kod ekliyorum, bunu https://bitbucket.org/mattgwagner/sharpssh adresinde yamaya çalışacağım. Teşekkürler!! – MattGWagner

+0

@Matt - Harika! Katkıda bulunduğunuz için teşekkür ederim. – kbrimington

İlgili konular