2010-07-21 4 views
6

से एक फ़ाइल स्ट्रीमिंग मैं दूरस्थ SFTP सर्वर से फ़ाइल प्राप्त करने के लिए SharpSSH का उपयोग करने का प्रयास कर रहा हूं, और मैं इसे स्ट्रीम के रूप में पढ़ना चाहता हूं।SharpSSH

मैंने पाया:

  • वर्ग Sftp है, जो एक Get विधि है कि यह एक स्थानीय फाइल करने के लिए बचाता है - पास

  • वर्ग SshStream, जो मैं क्या चाहते हैं की तरह कर सकता है, लेकिन Sftp से अलग दिखता है इसलिए मुझे स्वयं को एसएफटीपी भाग को लागू करना पड़ सकता है (??)

  • कक्षा ChannelSftp, जो एसएफटीपी विधियों को लागू करता है ई get(String, OutputStream) है, जो सही लगता है, सिवाय इसके कि यह एक निम्न स्तर के वर्ग है और यह सब पर कैसे भी यह दृष्टांत के लिए मेरे लिए स्पष्ट नहीं है

ऐसा लगता है कि अगर Sftp के ChannelSftp SftpChannel संपत्ति निजी नहीं था, मैं कर सकता इसका इस्तेमाल करें और सबकुछ सही होगा। यदि संभव हो तो मैं SharpSSH को हैकिंग से बचाना चाहता हूं।

क्या मुझे कुछ याद आ रही है?

उत्तर

8

मैंने कुछ काम किया, और इसका परीक्षण किया। इसे आज़माएं, और एपीआई मालिश करने के लिए स्वतंत्र महसूस करें।

सबसे पहले, आपको एक विधि की सतह की आवश्यकता होगी जो आपको 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(); 
    } 
} 
+0

वाह। मैंने अभी तक यह कोशिश नहीं की है - मैं एक एपीआई कॉल की उम्मीद कर रहा था जिसे मैं याद करता था - लेकिन ऐसा लगता है कि यह (भाग का) हो सकता है जो मुझे करना है। अभी के लिए मैं बस एक फ़ाइल में() प्राप्त करने जा रहा हूं, लेकिन बाद में मैं इस पर स्विच करूंगा। :-) – Ken

+0

मुझे पता है कि यह एक पुराना सवाल है, लेकिन मैं SharpSSH को कुछ कोड जोड़ रहा हूं और बिट्स को व्यवस्थित कर रहा हूं, मैं इसे https://bitbucket.org/mattgwagner/sharpssh पर कोशिश करने और पैच करने जा रहा हूं। धन्यवाद!! – MattGWagner

+0

@ मैट - बहुत बढ़िया! योगदान के लिए हेड-अप और आप पर अच्छा धन्यवाद। – kbrimington