2010-07-21 29 views
6

Tôi đang cố gắng sử dụng SharpSSH để tải tệp từ máy chủ SFTP từ xa và tôi muốn đọc tệp đó dưới dạng luồng.Truyền tệp từ SharpSSH

tôi thấy:

  • lớp Sftp, trong đó có một phương pháp Get đó lưu nó vào một tập tin địa phương - gần

  • lớp SshStream, mà có thể làm loại những gì tôi muốn, nhưng dường như tách rời khỏi Sftp vì vậy tôi có thể phải tự triển khai phần SFTP (??)

  • lớp ChannelSftp, thực hiện các phương pháp SFTP e get(String, OutputStream), mà dường như hoàn hảo, ngoại trừ đó là một lớp ở mức độ thấp và nó không phải ở tất cả rõ ràng để tôi làm thế nào để thậm chí nhanh chóng nó

Dường như nếu ChannelSftp SftpChannel tài sản Sftp 's là không tin, tôi có thể sử dụng nó và mọi thứ sẽ hoàn hảo. Tôi muốn tránh hack SharpSSH nếu có thể, mặc dù.

Tôi có thiếu gì đó không?

Trả lời

8

Tôi đã làm việc gì đó và thử nghiệm nó. Hãy thử và cảm thấy tự do để xoa bóp API.

Trước hết, bạn sẽ cần phải hiển thị phương pháp cho phép bạn tận dụng các phương pháp ChannelSftp yêu cầu OutputStream s thay vì tên tệp đích. Nếu bạn không muốn sử dụng sự phản chiếu để làm điều đó, thì hãy thêm phương thức này vào lớp Sftp và biên dịch lại SharpSSH.

public void GetWithStream(string fromFilePath, Tamir.SharpSsh.java.io.OutputStream stream) 
{ 
    cancelled = false; 
    SftpChannel.get(fromFilePath, stream, m_monitor); 
} 

Tiếp theo, tạo một wrapper cho lớp Stream đó là tương thích với Tamir.SharpSsh.java.io.OutputStream, chẳng hạn như hình dưới đây:

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; 
     } 
    } 
} 

Với những thành phần, bây giờ bạn có thể sử dụng OpenSSH stream dữ liệu của nó đến luồng bạn chọn, như được minh họa dưới đây với một số FileStream.

bằng System.IO; sử dụng 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(); 
    } 
} 
+0

Wow. Tôi vẫn chưa thử - tôi đã hy vọng một cuộc gọi API mà tôi đã bỏ lỡ - nhưng có vẻ như nó có thể là một phần của những gì tôi cần làm. Bây giờ tôi sẽ chỉ Get() vào một tập tin, nhưng có lẽ sau này tôi sẽ chuyển sang điều này. :-) – Ken

+0

Tôi biết đây là một câu hỏi cũ, nhưng tôi đang thêm vào một số mã để SharpSSH và tinh giản bit, tôi sẽ cố gắng và vá lỗi này tại https://bitbucket.org/mattgwagner/sharpssh. Cảm ơn!! – MattGWagner

+0

@Matt - Tuyệt vời! Cảm ơn bạn đã đứng đầu và chúc bạn đóng góp. – kbrimington

Các vấn đề liên quan