2012-11-01 10 views
12

मेरे पास एक ऐसा ऑब्जेक्ट लिखने का कार्य है जो एक अलग प्रकार के पथ/यूआरएल प्राप्त कर सकता है, और यह किस प्रकार का पथ/यूआरएल वापस कर सकता है। उदाहरण के लिए पथशारीरिक, सापेक्ष, पूर्ण और अन्य पथ

1. [drive]:\Temp 
2. \\Temp 
3. Temp (assuming that it relative Temp), 
4. /Temp 
5. ~/Temp 
6. file://[drive]:/Temp 
7. file://Temp 
8. [scheme]://something/Temp 

... और इसी तरह से हो सकता है।

यदि मैं भौतिक पथ, सापेक्ष यूआरएल, या पूर्ण यूआरएल है तो मैं C# में कैसे देख सकता हूं?

मुझे लगता है कि यह अपेक्षाकृत आसान है कि यह सापेक्ष या पूर्ण यूरी है, लेकिन यह कैसे जानना है कि यह यूएनसी पथ है या नहीं?

मैंने उरी ऑब्जेक्ट का उपयोग करने की कोशिश की और यह आईएसयूएनसी संपत्ति है, लेकिन यह वास्तव में मेरी मदद नहीं करता है .... c: \ temp यह झूठा लौटाता है, "/ temp", "temp /" और "temp" के लिए यह फेंकता है एक अपवाद है कि प्रारूप गलत है। .NET 3.5 में किसी भी निर्मित ऑब्जेक्ट में मौजूद है जो मुझे इसके साथ मदद कर सकता है, या पथ के प्रकार को निर्धारित करने के लिए मैं किस एल्गोरिदम का उपयोग कर सकता हूं?

+0

खैर है, "/ अस्थायी" वास्तव में एक यूआरआई बिल्कुल नहीं है। आप जिस सटीक प्रारूप को देखना चाहते हैं वह क्या है? यदि यह केवल पथ और यूआरआई है, तो आप पहले उनके बीच अंतर कर सकते हैं, और प्रत्येक के लिए अलग-अलग तकनीकों को लागू कर सकते हैं। – Vlad

+0

क्यों "/ temp" मान्य यूआरआई नहीं है? मुझे लगता है कि इसे सापेक्ष के रूप में व्याख्या किया जा सकता है। मुझे उन सभी प्रारूपों की जांच करने और यह तय करने की ज़रूरत है कि यह किस प्रकार है ... क्या यह यूएनसी पथ है या यह यूआरआई पथ है ... मैं उनके बीच अंतर कैसे कर सकता हूं? –

+0

ठीक है, http://tools.ietf.org/html/rfc3986। यह एक योजना के साथ शुरू नहीं होता है, उदाहरण के लिए (http: या फ़ाइल: करेगा) – Vlad

उत्तर

28

इस प्रयास करें:

var paths = new[] 
{ 
    @"C:\Temp", 
    @"\\Temp", 
    "Temp", 
    "/Temp", 
    "~/Temp", 
    "file://C:/Temp", 
    "file://Temp", 
    "http://something/Temp" 
}; 

foreach (string p in paths) 
{ 
    Uri uri; 
    if (!Uri.TryCreate(p, UriKind.RelativeOrAbsolute, out uri)) 
    { 
     Console.WriteLine("'{0}' is not a valid URI", p); 
    } 
    else if (!uri.IsAbsoluteUri) 
    { 
     Console.WriteLine("'{0}' is a relative URI", p); 
    } 
    else if (uri.IsFile) 
    { 
     if (uri.IsUnc) 
     { 
     Console.WriteLine("'{0}' is a UNC path", p); 
     } 
     else 
     { 
     Console.WriteLine("'{0}' is a file URI", p); 
     } 
    } 
    else 
    { 
     Console.WriteLine("'{0}' is an absolute URI", p); 
    } 
} 

आउटपुट:

'C: \ अस्थायी' एक फ़ाइल यूआरआई
'\\ अस्थायी' एक यूएनसी पथ है
'अस्थायी' एक है सापेक्ष URI
'/ अस्थायी' एक सापेक्ष URI
है '~/अस्थायी' एक सापेक्ष URI
है 'file: // सी:/अस्थायी' एक फ़ाइल यूआरआईहै 'file: // अस्थायी' एक यूएनसी पथ
'http: // कुछ/अस्थायी' है एक निरपेक्ष यूआरआई

+0

का उपयोग करने के लिए धन्यवाद, लेकिन इसके लिए मूल्य 'सी: \ Temp', '\\ Temp', 'फ़ाइल: // सी:/टेम्प' और 'फ़ाइल: // Temp' मेरी ऑब्जेक्ट को "भौतिकपाथ" वापस करना चाहिए और यूआरआई नहीं। –

+0

फिर "आईएससी पथ" और "फाइल यूआरआई" के बजाय "आईएसएफआईएल" शाखा को "भौतिकपाथ" मुद्रित करने के लिए बदलें। –

+0

System.Uri प्रोटोकॉल-सापेक्ष रिश्तेदार के रूप में व्यवहार करता है, लेकिन अधिकांश सुरक्षा संदर्भों में उनको पूर्ण पथ की तरह माना जाना चाहिए। तो 'http: // gmail.com' पूर्ण है, लेकिन' // जीमेल।कॉम 'सापेक्ष है, भले ही यह एक अलग डोमेन पर जा रहा हो। – yzorg

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