我正在尝试使用 SharpSSH 从远程 SFTP 服务器获取文件,并且我想将其作为流读取。
我发现:
Sftp
,其中有 Get
将其保存到本地文件的方法 -- 关闭 SshStream
,这可能会做我想要的,但似乎与 Sftp
不相交所以我可能必须自己实现 SFTP 部分 (??) ChannelSftp
,它实现了 SFTP 方法,如 get(String, OutputStream)
,这看起来很完美,只是它是一个低级类,而且对我来说如何实例化它一点也不明显看起来像
Sftp
的ChannelSftp 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/