2014-05-16 5 views
23

के साथ SFTP से फ़ाइलें डाउनलोड करें मैं एसएफटीपी सर्वर के साथ काम करने के लिए SSH.NET (Renci.SshNet) लाइब्रेरी का उपयोग कर रहा हूं। मुझे आज की तारीख के आधार पर एसएफटीपी सर्वर पर एक विशिष्ट फ़ोल्डर से फ़ाइलों को पकड़ना है। फिर उन फ़ाइलों को एसएफटीपी सर्वर से स्थानीय ड्राइव पर मेरा एक सर्वर कॉपी करें।SSH.NET लाइब्रेरी

ऊपर मेरे पास कोड है लेकिन यह काम नहीं कर रहा है। कभी-कभी यह कहता है कि फ़ाइल मौजूद नहीं है लेकिन कभी-कभी फ़ाइलों को डाउनलोड करने के लिए मेरे स्थानीय सर्वर पर नहीं होगा, लेकिन मुझे उस दिन के लिए दूरस्थ फ़ोल्डर में जो भी फ़ाइलें अपलोड की गई थी, उसे डाउनलोड करने की आवश्यकता है।

क्या कोई व्यक्ति देख सकता है और क्या गलत है? मेरा मानना ​​है कि इसका प्रवाह भाग के साथ कुछ करना है। मैंने फाइलों को अपलोड करने के अलावा एफ़टीपी के साथ बहुत कुछ काम किया है, जिसे मैंने पिछले कोड में लिया था और सोचा था कि मैं प्रक्रिया को उलट सकता हूं लेकिन यह काम नहीं कर रहा है। मेरे द्वारा उपयोग किया जाने वाला कोड इस example से अलग है।

+1

मेरे मामले में कोड केवल कनेक्शन समय पर ही रोक रहा है। यह कहता है 'प्रमाणीकरण के लिए कोई उपयुक्त प्रमाणीकरण विधि नहीं मिली। – Chirag

उत्तर

24

SSH.NET पुस्तकालय के साथ एक फ़ाइल डाउनलोड करने के लिए एक साधारण काम कर कोड है:

using (Stream fileStream = File.Create(@"C:\target\local\path\file.zip")) 
{ 
    sftp.DownloadFile("/source/remote/path/file.zip", fileStream); 
} 

, व्याख्या करने के लिए क्यों अपने कोड काम नहीं करता:

का दूसरा पैरामीटर SftpClient.DownloadFile एक डाउनलोड की गई सामग्री को लिखने के लिए एक स्ट्रीम है।

आप पढ़ने धारा के बजाय एक लिखने धारा में गुजर रहे हैं। और इसके अलावा जिस मार्ग को आप पढ़ रहे हैं, वह रीमोट पथ है, जो स्थानीय फ़ाइलों पर केवल File कक्षा के साथ काम नहीं कर सकता है। ,

Stream file1 = File.OpenWrite(localFileName); 

sftp.DownloadFile(file.FullName, file1); 

या और भी बेहतर File.Create का उपयोग किसी भी पिछले त्यागने के लिए:

बस File.OpenRead लाइन त्यागने और उसके बजाय पिछली File.OpenWrite कॉल का एक परिणाम का उपयोग करें (है कि आप सब पर अब उपयोग नहीं कर रहे) सामग्री जो स्थानीय फ़ाइल हो सकती है।

मुझे यकीन नहीं है कि आपका localFileName पूर्ण पथ या केवल फ़ाइल नाम धारण करने वाला है। तो तुम एक पथ बहुत जोड़ने के लिए, यदि आवश्यक हो तो आवश्यकता हो सकती है (sDir साथ localFileName गठबंधन?)

+3

'var file1 = File.OpenWrite (localFileName); sftp.DownloadFile (फ़ाइल। पूर्ण नाम, फ़ाइल 1); ' –

+0

@ स्वतंत्रता-एम धन्यवाद। सही किया। –

0

बिना आप कोई विशिष्ट त्रुटि संदेश प्रदान करने, यह विशिष्ट सुझाव देने के लिए मुश्किल है।

हालांकि, मैं एक ही उदाहरण का उपयोग कर रहा था और फ़ाइल.ऑनप्राइट पर एक अनुमति अपवाद प्राप्त कर रहा था - स्थानीय फ़ाइलनाम चर का उपयोग कर, क्योंकि पथ.गेटफाइल का उपयोग उस स्थान पर इंगित कर रहा था जो स्पष्ट रूप से फ़ाइल खोलने के लिए अनुमति नहीं होगी> सी : \ ProgramFiles \ IIS (एक्सप्रेस) \ filename.doc

मैंने पाया कि System.IO.Path.GetFileName का उपयोग करना सही नहीं है, इसके बजाय System.IO.Path.GetFullPath का उपयोग करें, "सी: \ ... "

फ़ाइलएक्सप्लोरर में अपना समाधान भी खोलें और फ़ाइल के लिए एएसपीनेट को अनुमति दें या फाइल धारण करने वाले किसी भी फ़ोल्डर को अनुमति दें। मैं उस बिंदु पर अपनी फाइल डाउनलोड करने में सक्षम था।

10

उदाहरण काम करता है, धाराओं को संभालने की नहीं सही तरीका जबकि ...

आप फ़ाइलों के समापन सुनिश्चित करने की आवश्यकता/इसके अलावा खंड .. का उपयोग कर, कोशिश जोड़ें/साथ धाराओं IO त्रुटियों को संभालने के लिए पकड़ें ...

 public void DownloadAll() 
    { 
     string host = @"sftp.domain.com"; 
     string username = "myusername"; 
     string password = "mypassword"; 

     string remoteDirectory = "/RemotePath/"; 
     string localDirectory = @"C:\LocalDriveFolder\Downloaded\"; 

     using (var sftp = new SftpClient(host, username, password)) 
     { 
      sftp.Connect(); 
      var files = sftp.ListDirectory(remoteDirectory); 

      foreach (var file in files) 
      { 
       string remoteFileName = file.Name; 
       if ((!file.Name.StartsWith(".")) && ((file.LastWriteTime.Date == DateTime.Today)) 

        using (Stream file1 = File.OpenWrite(localDirectory + remoteFileName)) 
        { 
         sftp.DownloadFile(remoteDirectory + remoteFileName, file1); 
        } 
      } 

     } 
    } 
2

@ मेरक मैरी के कोड का मेरा संस्करण। मैं जांच रहा हूं कि फाइलें पहले से मौजूद हैं और .txt और अन्य फ़ाइलों के लिए अलग-अलग डाउनलोड निर्देशिका

 static void DownloadAll() 
    { 
     string host = "xxx.xxx.xxx.xxx"; 
     string username = "@@@"; 
     string password = "123";string remoteDirectory = "/IN/"; 
     string finalDir = ""; 
     string localDirectory = @"C:\filesDN\"; 
     string localDirectoryZip = @"C:\filesDN\ZIP\"; 
     using (var sftp = new SftpClient(host, username, password)) 
     { 
      Console.WriteLine("Connecting to " + host + " as " + username); 
      sftp.Connect(); 
      Console.WriteLine("Connected!"); 
      var files = sftp.ListDirectory(remoteDirectory); 

      foreach (var file in files) 
      { 

       string remoteFileName = file.Name; 

       if ((!file.Name.StartsWith(".")) && ((file.LastWriteTime.Date == DateTime.Today))) 
       { 

        if (!file.Name.Contains(".TXT")) 
        { 
         finalDir = localDirectoryZip; 
        } 
        else 
        { 
         finalDir = localDirectory; 
        } 


        if (File.Exists(finalDir + file.Name)) 
        { 
         Console.WriteLine("File " + file.Name + " Exists"); 
        }else{ 
         Console.WriteLine("Downloading file: " + file.Name); 
          using (Stream file1 = File.OpenWrite(finalDir + remoteFileName)) 
        { 
         sftp.DownloadFile(remoteDirectory + remoteFileName, file1); 
        } 
        } 
       } 
      } 



      Console.ReadLine(); 

     } 
+1

यदि आप एक्स्टेंशन उपयोग फ़ाइलइन्फो फाई के आधार पर कुछ जोड़ना चाहते हैं, तो आप बस यह कर सकते हैं: 'स्ट्रिंग ext = fi.Extension;' और एक स्विच। क्योंकि 'लव-लिटर-फॉर-यू.टी.टी.टी.बी.बी.एस.' एक झूठी सकारात्मक होगी। या 'पथ। गेट एक्सटेंशन (myFilePath); ' –

+0

सावधान रहें, आप जांच रहे हैं कि फ़ाइल नाम में" .TXT "है और सर्वर ओएस के आधार पर आपको" .txt "(लोअरकेस) मिल सकता है .. दूरस्थ Filename को कम करने के लिए यह एक अच्छा विचार होगा परिवर्तनीय और फ़ाइल के बजाए स्थितियों के लिए इसका उपयोग करें। नाम ... –

+0

बेहतर: अगर (! file.Name.ToLower()। EndsWith ("। txt")) –

संबंधित मुद्दे