2010-08-17 6 views
11

में एक फ़ाइल डाउनलोड करना एक Google खोज डेल्फी में फ़ाइल को डाउनलोड करने के तरीके पर कुछ उदाहरण दिखाती है लेकिन अधिकांश बग्गी हैं और आधा समय मेरे अनुभव में काम नहीं करता है।डेल्फी

मैं एक साधारण मजबूत समाधान की तलाश में हूं जो मुझे एक एक्सई (मेरे ऐप को अपडेट करने के लिए) डाउनलोड करने देगा और डाउनलोड किए जाने तक त्रुटियों को चालू करने के लिए मौजूदा अपडेट थ्रेड के निष्पादन को रोक देगा। प्रक्रिया पहले से ही थ्रेड हो चुकी है ताकि डाउनलोड कोड निष्पादन तक हो, जब तक यह पूरा नहीं हो जाता है (उम्मीद है)।

यहाँ दो कार्यान्वयन है, दोनों बहुत जटिल
1. http://www.scalabium.com/faq/dct0116.htm
2. http://delphi.about.com/od/internetintranet/a/get_file_net.htm

उत्तर

12

दूसरा दृष्टिकोण इंटरनेट संसाधनों WinINet, Windows API का एक भाग का उपयोग कर का उपयोग करने का मानक तरीका है लग रहे हैं। मैंने इसका बहुत उपयोग किया है, और यह हमेशा अच्छा काम करता है। पहला दृष्टिकोण मैंने कभी कोशिश नहीं की है। (न तो "बहुत जटिल" है। विंडोज एपीआई का उपयोग करते समय हमेशा कुछ अतिरिक्त कदम होंगे।)

यदि आप एक बहुत ही सरल विधि चाहते हैं, तो आप बस UrlMon.URLDownloadToFile पर कॉल कर सकते हैं। आपको डाउनलोड के बारे में कोई अच्छा नियंत्रण नहीं मिलेगा (बिल्कुल!), लेकिन यह बहुत आसान है।

उदाहरण:

URLDownloadToFile(nil, 
        'http://www.rejbrand.se', 
        PChar(ExtractFilePath(Application.ExeName) + 'download.htm'), 
        0, 
        nil); 
+3

संकेत: 'फॉर्म' इकाई पर निर्भरता को हटाने के लिए 'पैरामस्ट्र (0) 'के साथ' Application.ExeName' को प्रतिस्थापित करें। – mjn

+0

@mjustin: सच है। लेकिन उत्पादन कोड में, आप फ़ाइलों को एप्लिकेशन की निर्देशिका में सहेजना नहीं चाहेंगे, जो केवल पढ़ने योग्य (प्रोग्राम फ़ाइलें) है, जब तक कि प्रोग्राम पोर्टेबल न हो (उदाहरण के लिए यूएसबी स्टिक पर चलता है)। –

+0

उत्तर एंड्रियास के लिए धन्यवाद। मैं दूसरे दृष्टिकोण के साथ गया जो मैंने पोस्ट किया था क्योंकि आपने कहा था कि यह मानक था, उम्मीद है कि यह विश्वसनीय साबित हो जाएगा। आपके प्रयास के लिए धन्यवाद। – Daisetsu

16

क्यों इंडी के उपयोग नहीं करते हैं। आप TIdHTTP का उपयोग करते हैं इसके सरल

procedure DownloadFile;  
var 
    IdHTTP1: TIdHTTP; 
    Stream: TMemoryStream; 
    Url, FileName: String; 
begin  
    Url := 'http://www.rejbrand.se'; 
    Filename := 'download.htm'; 

    IdHTTP1 := TIdHTTP.Create(Self); 
    Stream := TMemoryStream.Create; 
    try 
    IdHTTP1.Get(Url, Stream); 
    Stream.SaveToFile(FileName); 
    finally 
    Stream.Free; 
    IdHTTP1.Free; 
    end; 
end; 

तुम भी एक प्रगति बार OnWork का उपयोग करके और घटनाक्रम OnWorkBegin जोड़ सकते हैं

procedure IdHTTPWorkBegin(ASender: TObject; AWorkMode: TWorkMode;AWorkCountMax: Int64); 
begin 
    ProgressBar.Max := AWorkCountMax; 
    ProgressBar.Position := 0; 
end; 

procedure IdHTTPWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64); 
begin 
    ProgressBar.Position := AWorkCount; 
end; 

मुझे यकीन है कि नहीं कर रहा हूँ अगर मुख्य के संदर्भ में इन घटना आग थ्रेड, इसलिए वीसीएल घटकों के लिए किए गए किसी भी अपडेट को थ्रेडिंग मुद्दों का उपयोग करने के लिए tidnotify घटक का उपयोग करके किया जाना पड़ सकता है। शायद कोई और इसे देख सकता है।

+1

यदि फ़ाइल बड़ी है तो आप मेमोरी स्ट्रीम की बजाय फ़ाइल स्ट्रीम का उपयोग करना चाह सकते हैं। – MikeT