2011-08-15 17 views
19

मैं नए अपडेट के लिए एफ़टीपी स्थानों पर नजर रखने के लिए एक सेवा बना रहा हूं पार्स और WebRequestMethods.Ftp.ListDirectoryDetails का उपयोग कर एक FtpWebRequest प्रतिक्रिया से लौटे प्रतिसाद पार्स करने की क्षमता की आवश्यकता होती है विधि। यदि सभी प्रतिक्रियाएं एक ही प्रारूप का पालन करती हैं, तो यह काफी आसान होगा, लेकिन विभिन्न एफ़टीपी सर्वर सॉफ्टवेयर विभिन्न प्रतिक्रिया प्रारूप प्रदान करते हैं।सी # वर्ग WebRequestMethods.Ftp.ListDirectoryDetails एफ़टीपी प्रतिक्रिया

उदाहरण के लिए एक वापस कर सकती है:

08-10-11 12:02PM  <DIR>   Version2 
06-25-09 02:41PM   144700153 image34.gif 
06-25-09 02:51PM   144700153 updates.txt 
11-04-10 02:45PM   144700214 digger.tif 

और अन्य सर्वर वापस कर सकती है:

d--x--x--x 2 ftp  ftp   4096 Mar 07 2002 bin 
-rw-r--r-- 1 ftp  ftp  659450 Jun 15 05:07 TEST.TXT 
-rw-r--r-- 1 ftp  ftp  101786380 Sep 08 2008 TEST03-05.TXT 
drwxrwxr-x 2 ftp  ftp   4096 May 06 12:24 dropoff 

और अन्य मतभेद भी देखा गया है वहाँ इतना सूक्ष्म अंतर मैं हेवन 'की एक संख्या होने की संभावना टी अभी तक सामना करना पड़ा।

क्या किसी को पूरी तरह से प्रबंधित (विंडोज़ पर बाहरी डीएल तक पहुंच की आवश्यकता नहीं है) सी # कक्षा है जो इन परिस्थितियों को सहजता से संभालती है?

मुझे केवल निम्नलिखित विवरणों के साथ निर्देशिका की सामग्री सूचीबद्ध करने की आवश्यकता है: फ़ाइल/निर्देशिका नाम, अंतिम अद्यतन या बनाया गया टाइमस्टैम्प, फ़ाइल/निर्देशिका नाम।

किसी भी सुझाव के लिए अग्रिम धन्यवाद, गेविन

+2

बस एक नोट - एफ़टीपी लिस्टिंग के सटीक प्रारूप को निर्दिष्ट नहीं करता है, और 400 से अधिक प्रारूप मौजूद हैं (हालांकि केवल दो जो आपने सूचीबद्ध हैं, विंडोज और यूनिक्स) का सबसे अधिक उपयोग किया जाता है। –

+1

पुhew - यह बहुत सारे प्रारूप हैं! – Gavin

+1

मुझे यह उदाहरण मिला, लेकिन मुझे संदेह है कि यह बहुत मजबूत है - http://blogs.msdn.com/b/adarshk/archive/2004/09/15/230177.aspx – Gavin

उत्तर

4

एक समाधान मैं भर में आया था EdtFTPnet

EdtFTPnet काफी सुविधा पैक समाधान है कि विभिन्न एफ़टीपी बहुत सारे विकल्प संभालती है तो आदर्श है प्रतीत हो रहा है है।

यह मुक्त ओपन सोर्स समाधान है जिसे मैंने http://www.ftp2rss.com के लिए नियोजित किया है (मुझे थोड़ा सा टूल चाहिए जो मुझे चाहिए लेकिन यह भी दूसरों के लिए उपयोगी हो सकता है)।

0

Ftp.dll FTP client पर एक नज़र डालें।

इसमें विंडोज, यूनिक्स और नेटवेयर प्लेटफॉर्म पर अधिकांश एफ़टीपी सर्वरों के लिए automatic directory listing parser शामिल है।

कृपया ध्यान दें कि यह एक व्यावसायिक उत्पाद है जिसे मैंने विकसित किया है।

+0

चीयर्स पावेल, बहुत सराहना की। अब तक मुफ्त EdtFTPnet संस्करण तक चिपके रहेंगे जब तक कि मुझे इसके मुफ़्त संस्करण के साथ कुछ सीमाएं न मिलें। – Gavin

4

मैं इस एक ही समस्या का सामना करना पड़ रहा हूँ और एक Regex का उपयोग करके कैप्चर समूहों के उपयोग प्रत्येक पंक्ति से संबंधित जानकारी पार्स आउट कर एक सरल (बहुत मजबूत नहीं यद्यपि) समाधान का निर्माण किया है:

public static Regex FtpListDirectoryDetailsRegex = new Regex(@".*(?<month>(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec))\s*(?<day>[0-9]*)\s*(?<yearTime>([0-9]|:)*)\s*(?<fileName>.*)", RegexOptions.Compiled | RegexOptions.IgnoreCase); 

फिर आप निकाल सकते हैं द्वारा कैप्चर समूहों से बाहर मान:

 string ftpResponse = "-r--r--r-- 1 ftp ftp    0 Nov 19 11:08 aaa.txt"; 
     Match match = FtpListDirectoryDetailsRegex.Match(ftpResponse); 
     string month = match.Groups["month"].Value; 
     string day = match.Groups["day"].Value; 
     string yearTime = match.Groups["yearTime"].Value; 
     string fileName = match.Groups["fileName"].Value; 

कुछ बातें ध्यान दें नहीं हैं:

  • यह केवल ftpResponse चर में पाए गए प्रारूप के साथ निर्देशिका प्रतिक्रियाओं के लिए काम करेगा। मेरे मामले में मैं भाग्यशाली हूं कि प्रत्येक बार एक ही एफ़टीपी सर्वर तक पहुंच जाए और इसलिए यह संभावना नहीं है कि प्रतिक्रिया प्रारूप बदल जाएगा।
  • yearTime चर फ़ाइल के टाइमस्टैम्प के वर्ष या समय का प्रतिनिधित्व कर सकते हैं।चरित्र जो इंगित करेंगे कि इस पर कब्जा समूह एक समय के बजाय साल
+0

यह बहुत अच्छा काम करता है! –

6

पहले (DOS/Windows) के लिए होता है इस कोड को सूचीबद्ध करना होगा: आप के पेट के एक उदाहरण के लिए देख रहा करके स्वयं भी इस पार्स करने के लिए की आवश्यकता होगी :

FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://ftp.example.com/"); 
request.Credentials = new NetworkCredential("user", "password"); 
request.Method = WebRequestMethods.Ftp.ListDirectoryDetails; 
StreamReader reader = new StreamReader(request.GetResponse().GetResponseStream()); 

string pattern = @"^(\d+-\d+-\d+\s+\d+:\d+(?:AM|PM))\s+(<DIR>|\d+)\s+(.+)$"; 
Regex regex = new Regex(pattern); 
IFormatProvider culture = CultureInfo.GetCultureInfo("en-us"); 
while (!reader.EndOfStream) 
{ 
    string line = reader.ReadLine(); 
    Match match = regex.Match(line); 
    DateTime modified = 
     DateTime.ParseExact(
      match.Groups[1].Value, "MM-dd-yy hh:mmtt", culture, DateTimeStyles.None); 
    long size = (match.Groups[2].Value != "<DIR>") ? long.Parse(match.Groups[2].Value) : 0; 
    string name = match.Groups[3].Value; 

    Console.WriteLine(
     "{0,-16} size = {1,9} modified = {2}", 
     name, size, modified.ToString("yyyy-MM-dd HH:mm")); 
} 

आप मिल जाएगा:

Version2   size =   0 modified = 2011-08-10 12:02 
image34.gif  size = 144700153 modified = 2009-06-25 14:41 
updates.txt  size = 144700153 modified = 2009-06-25 14:51 
digger.tif  size = 144700214 modified = 2010-11-04 14:45 

अन्य (* nix) सूची के लिए, my answer to Parsing FtpWebRequest ListDirectoryDetails line देखते हैं।


लेकिन, वास्तव में सूची ListDirectoryDetails द्वारा दिया पार्स करने का प्रयास जाने के लिए सही तरीका नहीं है।

आप एक एफ़टीपी क्लाइंट का उपयोग करना चाहते हैं जो आधुनिक MLSD कमांड का समर्थन करता है जो RFC 3659 में निर्दिष्ट मशीन-पठनीय प्रारूप में निर्देशिका सूची देता है। प्राचीन LIST कमांड द्वारा लौटाए गए मानव-पठनीय प्रारूप को पार्स करना (FtpWebRequest द्वारा आंतरिक रूप से विधि के लिए उपयोग किया जाता है) अप्रचलित FTP सर्वर से बात करते समय अंतिम उपाय विकल्प के रूप में उपयोग किया जाना चाहिए, जो MLSD कमांड का समर्थन नहीं करता है (जैसे माइक्रोसॉफ्ट आईआईएस एफ़टीपी सर्वर)।


WinSCP .NET assembly साथ उदाहरण के लिए, आप अपने Session.ListDirectory या Session.EnumerateRemoteFiles तरीकों का उपयोग कर सकते हैं।

वे आंतरिक रूप से MLSD कमांड का उपयोग करते हैं, लेकिन LIST कमांड पर वापस आ सकते हैं और विभिन्न मानव-पठनीय लिस्टिंग प्रारूपों के दर्जनों का समर्थन कर सकते हैं।

  • Name
  • LastWriteTime (सही समय क्षेत्र के साथ)
  • Length
  • FilePermissions (व्यक्तिगत अधिकारों में पार्स)
  • :

    लौटे सूची की तरह गुणों के साथ RemoteFileInfo instances के संग्रह के रूप में प्रस्तुत किया जाता Group

  • Owner
  • IsDirectory
  • IsParentDirectory
  • IsThisDirectory


अधिकांश अन्य 3 पार्टी पुस्तकालयों भी ऐसा ही होगा (मैं WinSCP के लेखक हूँ)। FtpWebRequest class का उपयोग इस उद्देश्य के लिए विश्वसनीय नहीं है। दुर्भाग्य से, .NET ढांचे में कोई अन्य अंतर्निहित एफ़टीपी क्लाइंट नहीं है।

+0

साझा करने के लिए धन्यवाद। क्या मैं पूछ सकता हूं - आप इसे WinSCP में कैसे करते हैं? – c00000fd

+0

@ c00000fd क्या करें? निर्देशिका निर्देशिका? Https://winscp.net/eng/docs/library_session_listdirectory#example देखें –

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

  • कोई संबंधित समस्या नहीं^_^