Потоковая передача файла из SharpSSH - PullRequest
6 голосов
/ 21 июля 2010

Я пытаюсь использовать SharpSSH для получения файла с удаленного SFTP-сервера и хочу прочитать его как поток.

Я нашел:

  • class Sftp, который имеет метод Get, который сохраняет его в локальный файл - закрыть

  • class SshStream, который может делать то, что я хочу,но, похоже, отличается от Sftp, поэтому мне, возможно, придется реализовать часть SFTP самостоятельно (??)

  • class ChannelSftp, которая реализует методы SFTP, такие как get(String, OutputStream), что выглядит идеальноза исключением того, что это низкоуровневый класс, и для меня совершенно не очевидно, как его создать

Похоже, что свойство Sftp ChannelSftp SftpChannel не было приватнымЯ мог бы использовать это, и все было бы идеально.Я хотел бы избежать взлома SharpSSH, если это возможно.

Я что-то упустил?

1 Ответ

8 голосов
/ 31 июля 2010

Я что-то разработал и проверил. Попробуйте, и не стесняйтесь массировать API.

Прежде всего, вам нужно вспомнить метод, который позволит вам воспользоваться преимуществами ChannelSftp методов, которые вызывают OutputStream s вместо имен файлов назначения. Если вы не хотите использовать для этого рефлексию, добавьте этот метод в класс 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.

с использованием 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();
    }
}
...