2010-07-21 13 views
6

Estoy tratando de usar SharpSSH para obtener un archivo de un servidor SFTP remoto, y quiero leerlo como una transmisión.Transmitiendo un archivo desde SharpSSH

que encontré:

  • clase Sftp, que tiene un método Get que lo guarda en un archivo local - cerca

  • clase SshStream, lo que podría hacer algo de lo que quiero, pero parece disjuntas de Sftp por lo que podría tener que implementar la parte SFTP yo mismo (??)

  • clase ChannelSftp, que implementa métodos SFTP lik e get(String, OutputStream), que parece perfecto, excepto que es una clase de bajo nivel y no es en absoluto evidente para mí cómo incluso instanciar

Parece que si ChannelSftp SftpChannel propiedad Sftp 's no era privada, que pude usa eso y todo sería perfecto. Sin embargo, me gustaría evitar piratear SharpSSH si es posible.

¿Echo de menos algo?

Respuesta

8

He trabajado algo y lo he probado. Pruébalo y siéntete libre de dar masajes a la API.

En primer lugar, deberá hacer aparecer un método que le permita aprovechar los métodos ChannelSftp que requieren OutputStream s en lugar de nombres de archivo de destino. Si no desea usar el reflejo para hacerlo, agregue este método a la clase Sftp y vuelva a compilar SharpSSH.

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

A continuación, crear un contenedor para la clase Stream que sea compatible con Tamir.SharpSsh.java.io.OutputStream, tales como la de abajo:

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

Con esos ingredientes, ahora se puede utilizar OpenSSH para transmitir sus datos a la transmisión de su elección, como se muestra a continuación con un FileStream.

usando System.IO; usando 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

Wow. Todavía no lo he probado, esperaba una llamada API que me había perdido, pero parece que podría ser (parte de) lo que tengo que hacer. Por ahora solo voy a obtener() un archivo, pero tal vez más tarde cambie a esto. :-) – Ken

+0

Sé que esta es una vieja pregunta, pero estoy agregando un código para SharpSSH y agilizando los bits, voy a intentar y parchear esto en https://bitbucket.org/mattgwagner/sharpssh. ¡¡Gracias!! – MattGWagner

+0

@Matt - ¡Impresionante! Gracias por el aviso y buena-por-usted por contribuir. – kbrimington

Cuestiones relacionadas