मैं FtpWebRequest
विधि WebRequestMethods.Ftp.DownloadFile
के साथ एफ़टीपी से फ़ाइल डाउनलोड करने के लिए एक सरल विधि बनाने की कोशिश कर रहा हूं। समस्या यह है कि मैं डाउनलोड करने की प्रगति को प्रदर्शित नहीं करना चाहता हूं और इस प्रकार ट्रांसफर किए गए प्रतिशत की गणना करने में सक्षम होने के लिए आगे फ़ाइल आकार को जानने की आवश्यकता है। लेकिन जब मैं में GetResponse
पर कॉल करता हूं तो ContentLength
सदस्य -1 है।FtpWebRequest का उपयोग करना
ठीक है - इसलिए मुझे विधि WebRequestMethods.Ftp.GetFileSize
विधि का उपयोग कर फ़ाइल का आकार पहले से मिलता है। कोई बात नहीं। फिर आकार प्राप्त करने के बाद मैं फ़ाइल डाउनलोड करता हूं।
यह जहां विचाराधीन समस्या दिखाई देता है ...
आकार लेने के बाद मैं FtpWebRequest
पुन: उपयोग करने का प्रयास करें और WebRequestMethods.Ftp.DownloadFile
को विधि रीसेट करता है। इससे System.InvalidOperationException
ऐसा कुछ कहता है जैसे "अनुरोध भेजने के बाद यह क्रिया नहीं कर सकती।" (सटीक फॉर्मूलेशन नहीं हो सकता है - स्वीडिश में मिलने वाले एक से अनुवादित)।
मुझे कहीं और मिला है जब तक कि मैं KeepAlive
संपत्ति को सत्य पर सेट करता हूं, इससे कोई फर्क नहीं पड़ता, कनेक्शन सक्रिय रखा जाता है। यही वह है जिसे मैं समझ नहीं पा रहा हूं ... मैंने जो एकमात्र वस्तु बनाई है वह मेरी FtpWebRequest
ऑब्जेक्ट है। और यदि मैं एक और बनाता हूं, तो यह कैसे पता चलेगा कि किस कनेक्शन का उपयोग करना है? और क्या प्रमाण पत्र?
छद्म कोड:
Create FtpWebRequest
Set Method property to GetFileSize
Set KeepAlive property to true
Set Credentials property to new NetworkCredential(...)
Get FtpWebResponse from the request
Read and store ContentLength
अब मैं फ़ाइल आकार मिल गया। तो यह फ़ाइल डाउनलोड करने का समय है। सेटिंग विधि को ऊपर उल्लिखित अपवाद का कारण पता है। तो क्या मैं एक नया FtpWebRequest
बना सकता हूं? या फिर पुन: उपयोग करने के अनुरोध को रीसेट करने के लिए वैसे भी है? (प्रतिक्रिया को बंद करने से कोई फर्क नहीं पड़ता।)
मुझे समझ में नहीं आता कि ऑब्जेक्ट को फिर से बनाने के बिना आगे कैसे बढ़ना है। मैं ऐसा कर सकता था, लेकिन यह सही महसूस नहीं करता है। तो मैं इसे करने का सही तरीका खोजने की आशा में यहां पोस्ट कर रहा हूं।
यहाँ (गैर काम कर रहे) कोड है (इनपुट सूरी, sDiskName, sUser और sPwd कर रहे हैं।):
FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(sURI);
request.Method = WebRequestMethods.Ftp.GetFileSize;
request.Credentials = new NetworkCredential(sUser, sPwd);
request.UseBinary = true;
request.UsePassive = true;
request.KeepAlive = true;
FtpWebResponse resp = (FtpWebResponse)request.GetResponse();
int contLen = (int)resp.ContentLength;
resp.Close();
request.Method = WebRequestMethods.Ftp.DownloadFile;
resp = (FtpWebResponse)request.GetResponse();
Stream inStr = resp.GetResponseStream();
byte[] buff = new byte[16384];
sDiskName = Environment.ExpandEnvironmentVariables(sDiskName);
FileStream file = File.Create(sDiskName);
int readBytesCount;
int readTotal=0;
while ((readBytesCount = inStr.Read(buff, 0, buff.Length)) > 0)
{
readTotal += readBytesCount;
toolStripProgressBar1.Value = 100*readTotal/contLen;
Application.DoEvents();
file.Write(buff, 0, readBytesCount);
}
file.Close();
मुझे आशा है कि यह कैसे काम करने के लिए माना जाता है किसी को समझा सकते हैं। अग्रिम में धन्यवाद।
कम से कम HTTPWebRequests के साथ - आपको हमेशा एक नया बनाना होगा। मान लीजिए कि एक ही समस्या है। – Hikiko
'FtpWebRequest' एकल अनुरोध करने के लिए अच्छा है। आप एक एफ़टीपी क्लाइंट चाहते हैं, जो इसे बंद करने तक लगातार कनेक्शन को जोड़ता और बनाए रखता है। 'System.Net.FtpClient' अच्छी तरह से माना जाता है: http://netftp.codeplex.com/ –