2008-09-23 18 views

उत्तर

27

कुछ महत्वपूर्ण विचार:

  1. HTTP सर्वर निर्देशिका आप चाहते हैं के लिए निर्देशिका सूची देने के लिए कॉन्फ़िगर किया जाना है;
  2. क्योंकि निर्देशिका सूची सामान्य HTML पृष्ठ हैं, कोई मानक नहीं है जो निर्देशिका सूची के स्वरूप को परिभाषित करता है;
  3. विचार के कारण आप उस देश में हैं जहां आपको प्रत्येक सर्वर के लिए विशिष्ट कोड रखना होगा।

मेरी पसंद नियमित अभिव्यक्तियों का उपयोग करना है। यह तेजी से पार्सिंग और अनुकूलन के लिए अनुमति देता है। आप प्रति साइट विशिष्ट नियमित अभिव्यक्ति पैटर्न प्राप्त कर सकते हैं और इस तरह आपके पास एक बहुत ही मॉड्यूलर दृष्टिकोण है। यदि आप स्रोत कोड को बदले बिना नई साइट्स समर्थन के साथ पार्सिंग मॉड्यूल को बढ़ाने की योजना बनाते हैं तो नियमित अभिव्यक्ति पैटर्न पर यूआरएल मैपिंग के लिए बाहरी स्रोत का उपयोग करें।

उदाहरण से http://www.ibiblio.org/pub/

namespace Example 
{ 
    using System; 
    using System.Net; 
    using System.IO; 
    using System.Text.RegularExpressions; 

    public class MyExample 
    { 
     public static string GetDirectoryListingRegexForUrl(string url) 
     { 
      if (url.Equals("http://www.ibiblio.org/pub/")) 
      { 
       return "<a href=\".*\">(?<name>.*)</a>"; 
      } 
      throw new NotSupportedException(); 
     } 
     public static void Main(String[] args) 
     { 
      string url = "http://www.ibiblio.org/pub/"; 
      HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
      using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) 
      { 
       using (StreamReader reader = new StreamReader(response.GetResponseStream())) 
       { 
        string html = reader.ReadToEnd(); 
        Regex regex = new Regex(GetDirectoryListingRegexForUrl(url)); 
        MatchCollection matches = regex.Matches(html); 
        if (matches.Count > 0) 
        { 
         foreach (Match match in matches) 
         { 
          if (match.Success) 
          { 
           Console.WriteLine(match.Groups["name"]); 
          } 
         } 
        } 
       } 
      } 

      Console.ReadLine(); 
     } 
    } 
} 
8

बुनियादी समझ:

निर्देशिका सूचियों एक वेब सर्वर द्वारा उत्पन्न बस HTML पृष्ठों हैं। प्रत्येक वेब सर्वर इन HTML पृष्ठों को अपने तरीके से उत्पन्न करता है क्योंकि वेब निर्देशिका के लिए इन निर्देशिकाओं को सूचीबद्ध करने का कोई मानक तरीका नहीं है।

निर्देशिका सूची प्राप्त करने का सबसे अच्छा तरीका यह है कि आप जिस यूआरएल के लिए निर्देशिका सूची चाहते हैं, उसमें यूआरएल के लिए एक HTTP अनुरोध करना है और एचटीएमएल से आपके सभी लिंक को पार्स और निकालने का प्रयास करना है।

एचटीएमएल लिंक का विश्लेषण करने के लिए कृपया HTML Agility Pack का उपयोग करने का प्रयास करें।

निर्देशिका ब्राउज़िंग:

वेब सर्वर से निर्देशिका ब्राउज़िंग चालू अपनी निर्देशिका में फ़ाइलों की इस HTML प्रतिनिधित्व प्राप्त करने के लिए आवश्यक आप निर्देशिका की सूची करना चाहते हैं। इसलिए यदि आप HTTP सर्वर चाहते हैं तो आप केवल निर्देशिका सूची प्राप्त कर सकते हैं।

एचटीएमएल चपलता पैक का एक त्वरित उदाहरण:

HtmlDocument doc = new HtmlDocument(); 
doc.Load(strURL); 
foreach(HtmlNode link in doc.DocumentElement.SelectNodes("//[email protected]") 
{ 
HtmlAttribute att = link"href"; 
//do something with att.Value; 
} 

क्लीनर विकल्प:

अगर यह आपकी स्थिति में संभव है, एक क्लीनर विधि निर्देशिका के लिए एक इच्छित प्रोटोकॉल का उपयोग करने के लिए है लिस्टिंग, जैसे फ़ाइल ट्रांसफर प्रोटोकॉल (एफ़टीपी), एसएफटीपी (एसएसएच से अधिक एफ़टीपी) या एफटीपीएस (एसएसएल पर एफ़टीपी)।

क्या होगा यदि निर्देशिका ब्राउज़िंग चालू नहीं है:

वेब सर्वर निर्देशिका ब्राउज़िंग चालू नहीं है, तो निर्देशिका सूची प्राप्त करने के लिए कोई आसान तरीका है।

इस मामले में सबसे अच्छा आप किसी दिए गए यूआरएल से शुरू करना चाहते हैं, उसी पृष्ठ पर सभी एचटीएमएल लिंक का पालन करें, और इन HTML पर संसाधनों के सापेक्ष पथों के आधार पर निर्देशिकाओं की आभासी सूची बनाने का प्रयास करें पृष्ठों की है। यह आपको वेब सर्वर पर वास्तव में कौन सी फाइलें हैं, इसकी पूरी सूची नहीं देगा।

0

आप तब तक नहीं कर सकते जब तक कि आप जिस विशेष निर्देशिका में निर्देशिका निर्देशिका सक्षम नहीं करते हैं और कोई डिफ़ॉल्ट फ़ाइल नहीं है (आमतौर पर index.htm, index.html या default.html लेकिन हमेशा कॉन्फ़िगर करने योग्य)। तभी आपको एक निर्देशिका सूची के साथ प्रस्तुत किया जाएगा, जिसे आमतौर पर HTML के साथ चिह्नित किया जाएगा और पार्सिंग की आवश्यकता होगी।कोड से पहले

0

निर्देशिका सूची मुद्रित करने के लिए आप वैकल्पिक रूप से WebDAV के लिए सर्वर स्थापित कर सकते हैं।

2

महान पोस्ट के लिए धन्यवाद। मेरे लिए नीचे पैटर्न बेहतर काम किया।

<AHREF=\\"\S+\">(?<name>\S+)</A> 

मैंने इसे http://regexhero.net/tester पर भी परीक्षण किया।

अपने सी # कोड में इसका इस्तेमाल करने के लिए, आप है() पैटर्न में किसी भी बैकस्लैश और दोहरे उद्धरण चिह्नों से पहले मैं

<AHREF=\\"\S+\">(?<name>\S+)</A>

nstance के लिए और अधिक बैकस्लैश जोड़ने के लिए, GetDirectoryListingRegexForUrl विधि में आपको इस

वापसी "< एक HREF = \\" \ S + \\ "> (? \ S +)";

चीयर्स!

+0

बहुत बहुत धन्यवाद। यह समय बचाया। –

4

मैं सिर्फ ऊपर संशोधित किया और पाया यह सबसे अच्छा

public static class GetallFilesFromHttp 
{ 
    public static string GetDirectoryListingRegexForUrl(string url) 
    { 
     if (url.Equals("http://ServerDirPath/")) 
     { 
      return "\\\"([^\"]*)\\\""; 
     } 
     throw new NotSupportedException(); 
    } 
    public static void ListDiractory() 
    { 
     string url = "http://ServerDirPath/"; 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
     using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) 
     { 
      using (StreamReader reader = new StreamReader(response.GetResponseStream())) 
      { 
       string html = reader.ReadToEnd(); 

       Regex regex = new Regex(GetDirectoryListingRegexForUrl(url)); 
       MatchCollection matches = regex.Matches(html); 
       if (matches.Count > 0) 
       { 
        foreach (Match match in matches) 
        { 
         if (match.Success) 
         { 
          Console.WriteLine(match.ToString()); 
         } 
        } 
       } 
      } 
      Console.ReadLine(); 
     } 
    } 
} 
1

निम्नलिखित कोड मेरे लिए अच्छी तरह से काम करता है जब मैं FTP सर्वर पर पहुँच नहीं है:

public static string[] GetFiles(string url) 
{ 
    List<string> files = new List<string>(500); 
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
    using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) 
    { 
     using (StreamReader reader = new StreamReader(response.GetResponseStream())) 
     { 
      string html = reader.ReadToEnd(); 

      Regex regex = new Regex("<a href=\".*\">(?<name>.*)</a>"); 
      MatchCollection matches = regex.Matches(html); 

      if (matches.Count > 0) 
      { 
       foreach (Match match in matches) 
       { 
        if (match.Success) 
        { 
         string[] matchData = match.Groups[0].ToString().Split('\"'); 
         files.Add(matchData[1]); 
        } 
       } 
      } 
     } 
    } 
    return files.ToArray(); 
} 

हालांकि, जब मेरे पास FTP सर्वर तक पहुंच है, निम्न कोड बहुत तेज काम करता है:

public static string[] getFtpFolderItems(string ftpURL) 
{ 
    FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftpURL); 
    request.Method = WebRequestMethods.Ftp.ListDirectory; 

    //You could add Credentials, if needed 
    //request.Credentials = new NetworkCredential("anonymous", "password"); 

    FtpWebResponse response = (FtpWebResponse)request.GetResponse(); 

    Stream responseStream = response.GetResponseStream(); 
    StreamReader reader = new StreamReader(responseStream); 

    return reader.ReadToEnd().Split("\r\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); 
} 
संबंधित मुद्दे