我做了一些事情,並進行了測試。嘗試一下,隨時按摩API。
首先,您需要提供一種方法,使您可以利用ChannelSftp
方法調用OutputStream
而不是目標文件名。如果你不想使用反射來完成它,那麼將這個方法添加到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
所示。
using 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();
}
}
哇。我還沒有嘗試過 - 我希望我錯過了一個API調用 - 但是這看起來可能是我需要做的一部分。現在我只需要Get()到一個文件,但也許以後我會切換到這個。 :-) – Ken 2010-08-03 23:55:30
我知道這是一個老問題,但我在SharpSSH上添加了一些代碼並精簡了一些代碼,我將嘗試在https://bitbucket.org/mattgwagner/sharpssh中對其進行修補。謝謝!! – MattGWagner 2011-04-19 15:26:33
@Matt - 太棒了!感謝您的提拔和好評。 – kbrimington 2011-04-20 15:07:10