2008-12-07 12 views
59

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

यह फ़ाइल जांचने के लिए मुझे किस विधि या संपत्ति का उपयोग करना चाहिए?

उत्तर

100
var request = (FtpWebRequest)WebRequest.Create 
    ("ftp://ftp.domain.com/doesntexist.txt"); 
request.Credentials = new NetworkCredential("user", "pass"); 
request.Method = WebRequestMethods.Ftp.GetFileSize; 

try 
{ 
    FtpWebResponse response = (FtpWebResponse)request.GetResponse(); 
} 
catch (WebException ex) 
{ 
    FtpWebResponse response = (FtpWebResponse)ex.Response; 
    if (response.StatusCode == 
     FtpStatusCode.ActionNotTakenFileUnavailable) 
    { 
     //Does not exist 
    } 
} 

एक सामान्य नियम के रूप में यह एक बुरा विचार इस तरह अपने कोड में कार्यक्षमता के लिए अपवाद का उपयोग करने के लिए, इस उदाहरण में हालांकि मेरा मानना ​​है कि यह व्यावहारिकता के लिए एक जीत है। निर्देशिका में कॉलिंग सूची में इस तरह अपवादों का उपयोग करने से FAR अधिक अक्षम होने की संभावना है।

यदि आप नहीं हैं, तो बस जागरूक रहें कि यह अच्छी प्रथा नहीं है!

संपादित करें: "यह मेरे लिए काम करता है!"

यह अधिकांश ftp सर्वर पर काम करता प्रतीत होता है लेकिन सभी नहीं। SIZE कमांड काम करने से पहले कुछ सर्वरों को "टाइप I" भेजने की आवश्यकता होती है। एक सोचा होगा कि समस्या हल किया जाना चाहिए इस प्रकार है:

request.UseBinary = true; 

दुर्भाग्य यह है डिजाइन सीमा (बिग फैट बग!) है कि जब तक FtpWebRequest या तो डाउनलोड या एक फ़ाइल यह नहीं भेज देंगे अपलोड करने "प्रकार मैं है द्वारा एक "। चर्चा और माइक्रोसॉफ्ट प्रतिक्रिया here देखें।

मैं इसके बजाय निम्नलिखित WebRequestMethod का उपयोग करने की अनुशंसा करता हूं, यह मेरे द्वारा परीक्षण किए गए सभी सर्वरों पर मेरे लिए काम करता है, यहां तक ​​कि वे जो फ़ाइल आकार वापस नहीं करेंगे।

WebRequestMethods.Ftp.GetDateTimestamp 
+0

हैलो, मैंने अपना उपयोगकर्ता और मेरा पासवर्ड रखा है और अपना यूआरआई सेट किया है। फ़ाइल मौजूद है लेकिन यह कोड इंगित करता है कि यह –

+2

मौजूद नहीं है आप वास्तव में एक प्रतिभाशाली विचार कर रहे हैं! यह एक सम्मोहन की तरह काम करता है! –

+0

@ user42467, क्या FtpWebResponse प्रतिक्रिया = (FtpWebResponse) अनुरोध डालने का कोई कारण है। GetResponse(); कोशिश के अंदर, बस अनुरोध के बजाय। GETResponse(); – Daniel

4

क्योंकि

request.Method = WebRequestMethods.Ftp.GetFileSize 

सकता है कुछ मामले (550: आकार ASCII मोड में अनुमति नहीं है) में विफल रहता है, तो आप सिर्फ समय-चिह्न के बजाय देख सकते हैं।

reqFTP.Credentials = new NetworkCredential(inf.LogOn, inf.Password); 
reqFTP.UseBinary = true; 
reqFTP.Method = WebRequestMethods.Ftp.GetDateTimestamp; 
0

मैं अगर फ़ाइल मौजूद है की जाँच करने के FTPStatusCode.FileActionOK का उपयोग करें ...

तो, "और" खंड में, झूठी वापसी।

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