2012-02-14 15 views
5

सबसे पहले मुझे लगता है कि पूछा: ftp directory listing timeout. Huge number of subdirs। मुझे जवाब मिला।एफ़टीपी निर्देशिका आंशिक सूची

फिर भी यह है कि स्कैन करने के लिए वास्तव में लंबा समय लग सकता है, क्योंकि मैं निर्देशिका में एफ़टीपी वस्तुओं के सौ हजारों हो सकता है। हालांकि मैंने सोचा कि 'ए' और फिर 'बी' से शुरू होने वाली सभी ऑब्जेक्ट्स को पुनर्प्राप्त करना संभव हो सकता है ... जैसे ही यह निर्देशिकाओं को पुनर्प्राप्त करता है, यह बिना किसी प्रतीक्षा के अन्य थ्रेड पर प्रसंस्करण करना शुरू कर सकता है जब तक कि यह पूरी सूची न हो जाए ।

यह एफ़टीपी निर्देशिका मानक FtpWebRequest का उपयोग कर वाइल्डकार्ड के साथ लिस्टिंग करने के लिए संभव है?

उत्तर

6

FTP specification (RFC 3659) करने के लिए सबसे हाल ही में अद्यतन स्पष्ट रूप से इसे रोकता है। section 2.2.2 of that specification, titled "Wildcarding" (जोर मेरा) से:

आदेशों इस विनिर्देश में परिभाषित के लिए, सभी pathnames को सचमुच इलाज किया जा रहे हैं। यही कारण है कि एक पथ नाम एक कमांड, फ़ाइल जिसका नाम करने के लिए पथ नाम दिया निहित है समान है के लिए एक पैरामीटर के रूप में दिया के लिए, है। पथ नाम से कोई वर्ण, विशेष या "जादू" के रूप में माना जा सकता है इस प्रकार कोई पैटर्न मिलान (सटीक समानता के लिए छोड़कर) पथ नाम दिया जाता है और सर्वर एफ़टीपी के NVFS में मौजूद फ़ाइलों के बीच अनुमति दी है।

ग्राहक उस पैटर्न मिलान कार्यक्षमता के कुछ फार्म की इच्छा प्रासंगिक निर्देशिका, या निर्देशिका की एक सूची प्राप्त, और अपने स्वयं के फ़ाइल नाम चयन प्रक्रियाओं को लागू करना होगा।

जिसके अनुसार, अपने सर्वर इसका समर्थन करता है, तो आप अभी भी, FtpWebRequest class इस्तेमाल कर सकते हैं, लेकिन आप अपने आप को प्रतिक्रिया आइटमों की सूची को संभालने के लिए कार्रवाई करने के लिए होगा के रूप में नेट कक्षाएं नहीं समझोगे अपने सर्वर-विशिष्ट एक्सटेंशन।

0

एफ़टीपी विनिर्देश कहता है कि फाइलिंग कमांड फाइल करने के लिए तर्क (LIST, NLIST, MLSD, आदि) एक पथनाम है। तो कोई वाइल्डकार्ड नहीं होना चाहिए, जो भी हो।

RFC 959 (LIST + NLIST):

2,2। शब्दावली

...

pathname

पथ परिभाषित किया गया है चरित्र स्ट्रिंग एक फाइल सिस्टम के लिए इनपुट के लिए एक फ़ाइल की पहचान करने में किसी उपयोगकर्ता द्वारा जो होना चाहिए किया जाना है। पथनाम में आमतौर पर डिवाइस और/या निर्देशिका नाम होते हैं, और फ़ाइल नाम विनिर्देशन। एफ़टीपी अभी तक मानक पथनाम सम्मेलन निर्दिष्ट नहीं करता है। प्रत्येक उपयोगकर्ता को हस्तांतरण में शामिल फाइल सिस्टम के सम्मेलन नामकरण फ़ाइल का पालन करना होगा।

...

5.3.1।एफ़टीपी

आदेशों ...

LIST [<SP> <pathname>] <CRLF>
NLST [<SP> <pathname>] <CRLF>

RFC 3659 (MLSD):

2.2.2। वाइल्डकार्डिंग

इस विनिर्देशन में परिभाषित आदेशों के लिए, सभी पथनाम को शाब्दिक रूप से माना जाना चाहिए। वह है, एक पैरामीटर के रूप में दिए गए पथनाम के लिए, जिस फ़ाइल का नाम दिया गया पथनाम के समान है, का अर्थ है। पथनाम से कोई भी वर्ण विशेष या "जादू" के रूप में नहीं माना जा सकता है, इस प्रकार दिए गए पथनाम के बीच कोई पैटर्न मिलान नहीं (सटीक समानता के अलावा) और सर्वर में मौजूद फ़ाइलों को एफ़टीपी की अनुमति है।

...

7,1। MLSx का प्रारूप अनुरोध

...

वाक्य रचना MLSx आदेश के लिए है:

mlst    = "MLst" [ SP pathname ] CRLF 
mlsd    = "MLsD" [ SP pathname ] CRLF 

व्यवहार में, हालांकि कई FTP सर्वर बहस में wilcards का समर्थन करते हैं। लेकिन जैसा विनिर्देशन इसकी अनुमति नहीं देता है, वहां स्पष्ट रूप से समर्थित वाइल्डकार्ड के लिए कोई सेट मानक नहीं है।

vsftpd*, ? और LIST साथ {} का समर्थन करता है। vsftpd आधुनिक MLSD का समर्थन नहीं करता है।

proftpd*, ? और [] का समर्थन करता है। लेकिन केवल LIST के लिए। यह स्पष्ट रूप से वाइल्डकार्ड को MLSD के साथ टिप्पणी के साथ अनुमति नहीं देता है:

आरएफसी 3659 स्पष्ट रूप से ग्लोब वर्णों का समर्थन नहीं करता है। तो के बारे में चेतावनी दें, लेकिन आदेश जारी रखें।

pureftpd*, ? और [] दोनों LIST और MLSD के लिए समर्थन करता है।

FileZilla सर्वर* केवल दोनों LIST और MLSD का समर्थन करता है।


लेकिन सामान्य रूप से, आपको किसी भी वाइल्डकार्ड का समर्थन करने के लिए एफ़टीपी सर्वर पर भरोसा नहीं करना चाहिए।

एक संपूर्ण निर्देशिका सूची पुनर्प्राप्त करने और स्थानीय रूप से फ़ाइलों को फ़िल्टर करने के लिए एकमात्र विश्वसनीय दृष्टिकोण है। उदाहरण के लिए आप नियमित अभिव्यक्ति का उपयोग कर सकते हैं (Regex class)