2012-09-20 15 views
8

का उपयोग कर फ़ाइलों को डाउनलोड करना मैं FtpWebRequest का उपयोग कर फ़ाइल डाउनलोड करने का प्रयास कर रहा हूं।FtpWebRequest

private FtpWebRequest CreateFtpWebRequest(string ftpDirectoryPath, string userName, string password, bool keepAlive = false) 
{ 
    FtpWebRequest request = (FtpWebRequest)WebRequest.Create(new Uri(ftpDirectoryPath)); 

    //Set proxy to null. Under current configuration if this option is not set then the proxy that is used will get an html response from the web content gateway (firewall monitoring system) 
    request.Proxy = null; 

    request.UsePassive = true; 
    request.UseBinary = true; 
    request.KeepAlive = keepAlive; 

    request.Credentials = new NetworkCredential(userName, password); 

    return request; 
} 

यह डाउनलोड:

private void DownloadFile(string userName, string password, string ftpSourceFilePath, string localDestinationFilePath) 
{ 
    int bytesRead = 0; 
    byte[] buffer = new byte[1024]; 

    FtpWebRequest request = CreateFtpWebRequest(ftpSourceFilePath, userName, password, true); 
    request.Method = WebRequestMethods.Ftp.DownloadFile; 

    Stream reader = request.GetResponse().GetResponseStream(); 
    BinaryWriter writer = new BinaryWriter(File.Open(localDestinationFilePath, FileMode.CreateNew)); 

    while (true) 
    { 
     bytesRead = reader.Read(buffer, 0, buffer.Length); 

     if (bytesRead == 0) 
      break; 

     writer.Write(buffer, 0, bytesRead); 
    }   
} 

यह मेरे द्वारा बनाए गए इस CreateFtpWebRequest विधि का उपयोग करता। लेकिन जानकारी हमेशा दूषित होती है। किसी को पता है क्या हो रहा है?

+0

"हमेशा भ्रष्ट" से आपका क्या मतलब है? कृपया और स्पष्ट बताएं। – PVitt

+0

हालांकि मुझे एक और समस्या थी, 'CreateFtpWebRequest' फ़ंक्शन के 'request.Proxy = null' पंक्ति' के ऊपर विवरण टिप्पणी उस समस्या को हल करती है जो मेरे पास थी। इसलिए, ऊपर उठो! – UnTraDe

उत्तर

23

बस इसे लगा आउट:

private void DownloadFile(string userName, string password, string ftpSourceFilePath, string localDestinationFilePath) 
    { 
     int bytesRead = 0; 
     byte[] buffer = new byte[2048]; 

     FtpWebRequest request = CreateFtpWebRequest(ftpSourceFilePath, userName, password, true); 
     request.Method = WebRequestMethods.Ftp.DownloadFile; 

     Stream reader = request.GetResponse().GetResponseStream(); 
     FileStream fileStream = new FileStream(localDestinationFilePath, FileMode.Create); 

     while (true) 
     { 
      bytesRead = reader.Read(buffer, 0, buffer.Length); 

      if (bytesRead == 0) 
       break; 

      fileStream.Write(buffer, 0, bytesRead); 
     } 
     fileStream.Close();  
    } 

बजाय एक FileStream उपयोग करने के लिए था।

+0

"fileStream.Close();" जोड़ने की आवश्यकता है थोड़ी देर के बाद। अन्यथा, डाउनलोड की गई फ़ाइल को छोटा कर दिया जा सकता है। – nanonerd

+0

क्या मुझे कुछ याद आ रहा है या क्या यह समाधान केवल 2kB से छोटी फ़ाइलों को डाउनलोड करने देता है? – Chrisi

+1

बफर का उपयोग हम जो डाउनलोड कर रहे हैं उसके 'चंक' को पकड़ने के लिए किया जाता है। वे टुकड़े 2 केबी आकार में आते हैं। लूप में हम 2kb भाग पढ़ते रहते हैं जब तक कि और नहीं होते। –

4

नेट ढांचे का उपयोग कर एक FTP सर्वर से एक फ़ाइल डाउनलोड करने के लिए सबसे छोटी रास्ता WebClient.DownloadFile method उपयोग कर रहा है:

WebClient client = new WebClient(); 
client.Credentials = new NetworkCredential("username", "password"); 
client.DownloadFile(
    "ftp://ftp.example.com/remote/path/file.zip", @"C:\local\path\file.zip"); 

उपयोग FtpWebRequest class, तो आप एक अधिक से अधिक नियंत्रण चाहते हैं तो केवल, कि WebClient वर्ग प्रदान नहीं करता है (जैसे टीएलएस/एसएसएल एन्क्रिप्शन, प्रगति निगरानी आदि)।

FtpWebRequest request = 
    (FtpWebRequest)WebRequest.Create("ftp://ftp.example.com/remote/path/file.zip"); 
request.Credentials = new NetworkCredential("username", "password"); 
request.Method = WebRequestMethods.Ftp.DownloadFile; 

using (Stream ftpStream = request.GetResponse().GetResponseStream()) 
using (Stream fileStream = File.Create(@"C:\local\path\file.zip")) 
{ 
    byte[] buffer = new byte[10240]; 
    int read; 
    while ((read = ftpStream.Read(buffer, 0, buffer.Length)) > 0) 
    { 
     fileStream.Write(buffer, 0, read); 
     Console.WriteLine("Downloaded {0} bytes", fileStream.Position); 
    } 
} 
: हिस्सा खुद के द्वारा

FtpWebRequest request = 
    (FtpWebRequest)WebRequest.Create("ftp://ftp.example.com/remote/path/file.zip"); 
request.Credentials = new NetworkCredential("username", "password"); 
request.Method = WebRequestMethods.Ftp.DownloadFile; 

using (Stream ftpStream = request.GetResponse().GetResponseStream()) 
using (Stream fileStream = File.Create(@"C:\local\path\file.zip")) 
{ 
    ftpStream.CopyTo(fileStream); 
} 

केवल, यदि आप एक डाउनलोड प्रगति की निगरानी करने की जरूरत है, तो आप है सामग्री की प्रतिलिपि करने के लिए: एक आसान तरीका है, बस FileStream को एक FTP प्रतिक्रिया स्ट्रीम कॉपी करने के लिए Stream.CopyTo विधि का उपयोग कर रहा है

जीयूआई प्रगति (WinForms ProgressBar) के लिए देखें:
FtpWebRequest FTP download with ProgressBar

आप किसी दूरस्थ फ़ोल्डर से सभी फाइलों को डाउनलोड करने के लिए चाहते हैं,देखना C# Download all files and subdirectories through FTP

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