2010-02-15 13 views
6

में प्रोग्रामेटिक रूप से एक बड़ी फ़ाइल को कैसे डाउनलोड करें मुझे इसे संसाधित करने से पहले प्रोग्रामेटिक रूप से बड़ी फ़ाइल डाउनलोड करने की आवश्यकता है। ऐसा करने का सबसे अच्छा तरीका क्या है? चूंकि फ़ाइल बड़ी है, इसलिए मैं प्रतीक्षा करने के लिए विशिष्ट समय चाहता हूं ताकि मैं मजबूती से बाहर निकल सकूं।सी #

मुझे WebClient.DownloadFile() के बारे में पता है। लेकिन इंतजार करने के लिए पर्याप्त समय तय करने का एक तरीका प्रतीत नहीं होता है ताकि बलपूर्वक बाहर निकलने के लिए। जबरदस्ती बाहर निकलने के लिए (int एमएस)

try 
{ 
    WebClient client = new WebClient(); 
    Uri uri = new Uri(inputFileUrl); 
    client.DownloadFile(uri, outputFile); 
} 
catch (Exception ex) 
{ 
    throw; 
} 

एक और तरीका है फ़ाइल डाउनलोड करने और आदेश ProcessStartInfo और उपयोग की प्रक्रिया 'WaitForExit का उपयोग कर आग एक कमांड लाइन उपयोगिता (wget) का प्रयोग है।

ProcessStartInfo startInfo = new ProcessStartInfo(); 
//set startInfo object 

try 
{ 
    using (Process exeProcess = Process.Start(startInfo)) 
    { 
     //wait for time specified 
     exeProcess.WaitForExit(1000 * 60 * 60);//wait till 1m 

     //check if process has exited 
     if (!exeProcess.HasExited) 
     { 
      //kill process and throw ex 
      exeProcess.Kill(); 
      throw new ApplicationException("Downloading timed out"); 
     } 
    } 
} 
catch (Exception ex) 
{ 
    throw; 
} 

क्या कोई बेहतर तरीका है? कृपया मदद करे। धन्यवाद।

+0

uri क्या है ? क्या यह एफटीपी है? – t0mm13b

उत्तर

16

WebRequest का उपयोग करें और response stream प्राप्त करें। फिर बाइट्स के रिस्पॉन्स स्ट्रीम ब्लॉक से पढ़ें, और प्रत्येक ब्लॉक को गंतव्य फ़ाइल में लिखें। इस तरह आप जब डाउनलोड बहुत अधिक समय लेता है, तो रोकने के लिए, आप मात्रा के बीच नियंत्रण पाने के रूप में नियंत्रित कर सकते हैं और आप तय कर सकते हैं अगर डाउनलोड एक घड़ी के आधार पर समय समाप्त हो गया:            

 DateTime startTime = DateTime.UtcNow; 
     WebRequest request = WebRequest.Create("http://www.example.com/largefile"); 
     WebResponse response = request.GetResponse(); 
     using (Stream responseStream = response.GetResponseStream()) { 
      using (Stream fileStream = File.OpenWrite(@"c:\temp\largefile")) { 
       byte[] buffer = new byte[4096]; 
       int bytesRead = responseStream.Read(buffer, 0, 4096); 
       while (bytesRead > 0) {  
        fileStream.Write(buffer, 0, bytesRead); 
        DateTime nowTime = DateTime.UtcNow; 
        if ((nowTime - startTime).TotalMinutes > 5) { 
         throw new ApplicationException(
          "Download timed out"); 
        } 
        bytesRead = responseStream.Read(buffer, 0, 4096); 
       } 
      } 
     } 
+0

@orip, यह जटिल कैसे है? – juan

+0

@ जुआन, एक के लिए यह तुल्यकालिक है। इस उदाहरण का असीमित संस्करण बहुत अलग दिखाई देगा। लेकिन यह भी उपयोगकर्ता के अनुकूल वेब क्लाइंट मुखौटा को फेंकता है जो स्ट्रीम प्रबंधन सामग्री को छुपाता है जो काफी हद तक 90% अप्रासंगिक है। – Josh

+1

ओरिप, आपका कोड बहुत आसान है। रीमस कोड का उपयोग करने का एक फायदा यह है कि मैं फ़ाइल का कितना हिस्सा डाउनलोड कर सकता हूं। – hIpPy

7

कैसे वेब क्लाइंट क्लास में DownloadFileAsync का उपयोग करने के बारे में। इस मार्ग पर जाने के बारे में अच्छी बात यह है कि यदि आप बहुत अधिक समय लेते हैं तो आप CancelAsync पर कॉल करके ऑपरेशन रद्द कर सकते हैं। असल में, इस विधि को कॉल करें, और यदि निर्दिष्ट समय बीत जाता है, तो रद्द करें पर कॉल करें।

4

यहां पूछे जाने पर: C#: Downloading a URL with timeout

सरल समाधान:

public string GetRequest(Uri uri, int timeoutMilliseconds) 
{ 
    var request = System.Net.WebRequest.Create(uri); 
    request.Timeout = timeoutMilliseconds; 
    using (var response = request.GetResponse()) 
    using (var stream = response.GetResponseStream()) 
    using (var reader = new System.IO.StreamReader(stream)) 
    { 
     return reader.ReadToEnd(); 
    } 
} 

बेहतर (और अधिक लचीला) समाधान एक WebClientWithTimeout सहायक वर्ग के रूप में, एक ही सवाल का this answer है।

+4

webrequest.timeout केवल तब तक उपाय करता है जब तक HTTP प्रतिक्रिया शीर्षलेख प्राप्त नहीं होते हैं, प्रतिक्रिया समय तक डाउनलोड नहीं होने तक कुल समय नहीं। अर्थात। यह GetResponse रिटर्न तक समय को प्रभावित करता है। –

+0

अच्छा बिंदु, मुझे इसके बारे में पता नहीं था – orip

2

आप DownloadFileAsync उपयोग कर सकते हैं के रूप में @BFree कहा और उसके बाद निम्न WebClient की घटनाओं के साथ प्रयास करें

protected virtual void OnDownloadProgressChanged(DownloadProgressChangedEventArgs e); 
protected virtual void OnDownloadFileCompleted(AsyncCompletedEventArgs e); 

तो फिर तुम प्रगति का प्रतिशत पता कर सकते हैं

e.ProgressPercentage 

आशा इस मदद करता है