首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从SharpSSH流文件

从SharpSSH流文件
EN

Stack Overflow用户
提问于 2010-07-21 00:54:32
回答 1查看 5.3K关注 0票数 6

我试图使用SharpSSH从远程SFTP服务器获取文件,并希望将其作为流读取。

我发现:

  • Sftp,它有一个将其保存到本地文件的Get方法--关闭
  • SshStream,这可能做我想做的事情,但似乎与Sftp不存在关系,所以我可能不得不自己实现SFTP部分(??)

h19类ChannelSftp,它实现了SFTP方法,比如get(String, OutputStream),这似乎很完美,除了它是一个低级类,而且我甚至不清楚如何实例化它H 212f 213

看起来,如果SftpChannelSftp SftpChannel财产不是私有的,我可以用它,一切都会很完美。不过,如果可能的话,我想避免侵入SharpSSH。

我是不是遗漏了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-07-31 03:49:22

我想出了一些办法,并进行了测试。试一试,随意按摩API。

首先,您需要显示一个方法,该方法允许您利用ChannelSftp方法调用OutputStream,而不是目标文件名。如果您不想使用反射来完成它,那么将此方法添加到Sftp类并重新编译SharpSSH。

代码语言:javascript
复制
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兼容的包装器,如下所示:

代码语言:javascript
复制
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;

代码语言:javascript
复制
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();
    }
}
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3295552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档