.net - 从 SharpSSH 流式传输文件

标签 .net streaming sftp sharpssh

我正在尝试使用 SharpSSH 从远程 SFTP 服务器获取文件,并且我想将其作为流读取。

我发现:

  • 类(class) Sftp ,其中有 Get将其保存到本地文件的方法 -- 关闭
  • 类(class) SshStream ,这可能会做我想要的,但似乎与 Sftp 不相交所以我可能必须自己实现 SFTP 部分 (??)
  • 类(class) ChannelSftp ,它实现了 SFTP 方法,如 get(String, OutputStream) ,这看起来很完美,只是它是一个低级类,而且对我来说如何实例化它一点也不明显

  • 看起来像 SftpChannelSftp SftpChannel属性(property)不是私有(private)的,我可以使用它,一切都会很完美。不过,如果可能的话,我想避免破解 SharpSSH。

    我错过了什么吗?

    最佳答案

    我解决了一些问题,并对其进行了测试。试一试,随意按摩 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();
        }
    }
    

    关于.net - 从 SharpSSH 流式传输文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3295552/

    相关文章:

    c# - SFTP 和 "FTP over SSH"的区别

    c# - 线程安全的通用字段

    c# - 成为 "the real administrator"(Windows) 并在 .NET C# 中执行真正的管理任务?

    android - Android 上类似 teamviewer 的应用程序技术

    objective-c - 在 AVPlayer 中静音 HTTP 实时流

    Spring 批处理 : How to use spring batch to read file from sftp server and save it into database?

    c# - 在 Windows 7 事件日志中,什么是 "Source"?

    .net - NUnit 和与 Jenkins 的持续集成 : which NUnit-files are needed?

    Android-测试设备的 Mediaplayer 流媒体问题

    python - 使用 pysftp 或 Paramiko,如何获得包含属性的完整目录列表?