2012-10-24 29 views
20

त्वरित प्रश्न:फाइल एक्सटेंशन या "HasExtension" से उरी वस्तु सी # प्रकार bool जाओ

किसी को भी एक बेहतर तरीका के बारे में सोच सकते हैं तो रेगुलर एक्सप्रेशन से या सामान्य पाठ है कि क्या एक उरी वस्तु (यूआरएल नहीं स्ट्रिंग) बाहर काम करने के लिए खोज है एक दस्तावेज़ विस्तारण?

किसी भी विचारों का स्वागत करता है। क्षमा करें अगर मुझे .NET Framework/Uri क्लास में कुछ याद आया है जो पहले से ही ऐसा करता है।


थोड़ा अधिक जटिलता के अनुसार।


मैं craigtp का जवाब स्वीकार कर लिया है; हालांकि, मुझे इस समाधान के लिए क्या चाहिए।

var hasExtension = Path.HasExtension(requestUri.AbsolutePath); 

उन सभी को जो इस पर गए थे। एक पूर्ण और व्यापक उत्तर के लिए, आपको आगे की जांच करने के लिए निश्चित रूप से एक माइम प्रकार शब्दकोश की आवश्यकता होगी। उदाहरण लिए http://example/this.is.sort.of.valid.but.not.a.mime.type वापसी होगी "सही" के लिए मैं क्या जरूरत है, मैं पथ के इस प्रकार में आ रहा है।

+6

मुझे यकीन नहीं है कि आप उन अंतिम दो मामलों को अलग-अलग बता सकेंगे, जब तक कि आपके पास "मान्यता प्राप्त" एक्सटेंशन की सूची न हो। – Rawling

+0

मैंने इसे अपने संपादन में संबोधित किया है - हालांकि अच्छा बिंदु। – LiverpoolsNumber9

+0

"मैंने क्रेगेट के जवाब को स्वीकार कर लिया है, हालांकि," हे @ लिवरपूलसम्बर 9, इसे नीचे दिए गए एक नए उत्तर में अपना उत्तर देकर बदला जाना चाहिए, और फिर इसे उत्तर के रूप में चिह्नित करें (इस तरह, वैसे, पूरी तरह स्वीकार्य है , भले ही आपके पास तुरंत अपना जवाब हो)। आप अभी भी मदद के दूसरे उत्तर को श्रेय दे सकते हैं, लेकिन चिह्नित उत्तर, जैसा कि आप दिखाते हैं, सवाल का पूरा जवाब नहीं है, इसे 'उरी' प्रकार से कैसे प्राप्त किया जाए। –

उत्तर

19

आप अगर एक उरी के स्ट्रिंग का एक एक्सटेंशन है निर्धारित करने के लिए System.IO.Path वर्ग के HasExtension विधि का उपयोग कर सकते हैं।

Uri ऑब्जेक्ट की संपत्ति का उपयोग करके, आप उरी का प्रतिनिधित्व करने वाली पूरी स्ट्रिंग पुनर्प्राप्त कर सकते हैं। इस स्ट्रिंग को पथ वर्ग की HasExtension विधि में पास करने से एक बूलियन सही ढंग से वापस आ जाएगा जो इंगित करता है कि उरी में फ़ाइल एक्सटेंशन है या नहीं।

इस कोड का परीक्षण करने के लिए निम्न कोड को एक सरल कंसोल एप्लिकेशन में कॉपी और पेस्ट करें। केवल myUri3 और myUrl4 वापस लौटें, जो यह भी दर्शाता है कि HasExtension विधि फ़ाइल नाम (और एक्सटेंशन) के बाद अतिरिक्त वर्णों (यानी क्वेरीस्ट्रिंग्स) के साथ सही तरीके से निपट सकती है।

using System; 
using System.IO; 
namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Uri myURI1 = new Uri(@"http://www.somesite.com/"); 
      Uri myURI2 = new Uri(@"http://www.somesite.com/filenoext"); 
      Uri myURI3 = new Uri(@"http://www.somesite.com/filewithext.jpg"); 
      Uri myURI4 = new Uri(@"http://www.somesite.com/filewithext.jpg?q=randomquerystring"); 

      Console.WriteLine("Does myURI1 have an extension: " + Path.HasExtension(myURI1.AbsoluteUri)); 
      Console.WriteLine("Does myURI2 have an extension: " + Path.HasExtension(myURI2.AbsoluteUri)); 
      Console.WriteLine("Does myURI3 have an extension: " + Path.HasExtension(myURI3.AbsoluteUri)); 
      Console.WriteLine("Does myURI4 have an extension: " + Path.HasExtension(myURI4.AbsoluteUri)); 

      Console.ReadLine(); 
     } 
    } 
} 

संपादित करें:

अगर विस्तार एक वैध विस्तार है निर्धारित करने के बारे में प्रश्न प्रश्नकर्ता के संपादन के आधार पर, मैं नीचे कुछ नए कोड को मार पड़ी है (& कॉपी एक कंसोल एप्लिकेशन में पेस्ट):

using System; 
using System.IO; 
namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Uri myUri1 = new Uri("http://www.somesite.com/folder/file.jpg?q=randomquery.string"); 
      string path1 = String.Format("{0}{1}{2}{3}", myUri1.Scheme, Uri.SchemeDelimiter, myUri1.Authority, myUri1.AbsolutePath); 
      string extension1 = Path.GetExtension(path1); 
      Console.WriteLine("Extension of myUri1: " + extension1); 

      Uri myUri2 = new Uri("http://www.somesite.com/folder/?q=randomquerystring"); 
      string path2 = String.Format("{0}{1}{2}{3}", myUri2.Scheme, Uri.SchemeDelimiter, myUri2.Authority, myUri2.AbsolutePath); 
      string extension2 = Path.GetExtension(path2); 
      Console.WriteLine("Extension of myUri1: " + extension2); 

      Console.ReadLine(); 
     } 
    } 
} 

इस नए कोड अब डी-निर्माणों एक उरी वस्तु के घटक भागों के सभी (यानी योजना - http हिस्सा आदि) और विशेष रूप से उरी के किसी भी क्वेरीस्ट्रिंग हिस्से को हटा देता है। यह Adriano द्वारा इस उत्तर पर एक टिप्पणी में संभावित समस्या के आसपास हो जाता है कि क्वेरीस्ट्रिंग में एक डॉट कैरेक्टर हो सकता है (जिससे संभावित रूप से HasExtension विधि को गड़बड़ कर दिया जा सकता है)।

एक बार उरी डी का निर्माण किया है, अब हम ठीक से निर्धारित कर सकते हैं दोनों उरी स्ट्रिंग एक विस्तार क्या कि विस्तार है है और यह भी है।

यहां से, यह ज्ञात मान्य एक्सटेंशन की सूची के विरुद्ध इस एक्सटेंशन से मेल खाने का मामला है। यह हिस्सा है कि नेट ढांचे आप के रूप में कभी नहीं दिया जाएगा किसी भी फाइल एक्सटेंशन संभवतः मान्य है (किसी भी आवेदन करता है, तो यह इच्छाओं तो यह की अपनी फाइल एक्सटेंशन कर सकते हैं!)

+0

-1 के बजाय' Path.GetExtension (request.Url.AbsolutePath) 'का भी उपयोग कर सकते हैं -1 AbsoluteUri यूआरआई से क्वेरी और टुकड़ा नहीं हटाता है। –

+1

@ एड्रियनो - ओपी के मूल प्रश्न में (केवल एक उरी _has_ एक एक्सटेंशन पूछना, _what_ नहीं है), यह नहीं है! – CraigTP

+0

ठीक है, एक यूआरआई _can_ में क्वेरी और खंड भाग है (और ** डॉट क्वेरी भाग ** में हो सकता है, अंतिम खंड में नहीं) –

7

Uri.IsFile संपत्ति दूसरों के द्वारा सुझाव दिया काम नहीं करता है कभी नहीं होता Path.HasExtension है, तथापि,।

डॉक्स से

The IsFile property is true when the Scheme property equals UriSchemeFile. 

file://server/filename.ext" 

http://msdn.microsoft.com/en-us/library/system.uri.isfile.aspx

आप क्या कर सकते यूआरआई की AbsolutePath और उसके बाद का उपयोग करें (जो/संपर्क या उदाहरण के लिए /images/logo.png से मेल खाती है) मिलता है विस्तार/जांच करने के लिए FileInfo कक्षा।

var uris = new List<Uri>() 
{ 
    new Uri("http://mysite.com/contact"), 
    new Uri("http://mysite.com/images/logo.png"), 
    new Uri("http://mysite.com/images/logo.png?query=value"), 
}; 

foreach (var u in uris) 
{ 
    var fi = new FileInfo(u.AbsolutePath); 
    var ext = fi.Extension; 
    if (!string.IsNullOrWhiteSpace(ext)) 
    { 
    Console.WriteLine(ext); 
    } 
} 

आप शायद समर्थित एक्सटेंशन की एक सूची के खिलाफ जांच करने के लिए और अधिक जटिल मामलों में (contact.is.sortof.valid और contact.is.sortof.valid.png)

टेस्ट संभाल करने की जरूरत है:

"http://mysite.com/contact"        //no ext 
"http://mysite.com/contact?query=value"     //no ext 
"http://mysite.com/contact?query=value.value"   //no ext 
"http://mysite.com/contact/"       //no ext 
"http://mysite.com/images/logo.png"      //.png 
"http://mysite.com/images/logo.png?query=value"   //.png 
"http://mysite.com/images/logo.png?query=value.value" //.png 
"http://mysite.com/contact.is.sortof.valid"    //.valid 
"http://mysite:123/contact.is.sortof.valid"    //.valid 
+0

शायद ओपी समर्थित उत्तर की एक सूची उत्पन्न करने के लिए इस उत्तर के साथ आपके उत्तर को जोड़ सकता है (http://stackoverflow.com/questions/3937958/how-can-i-query-iis-for-mime-type-mappings) एमआईएमई प्रकार विन्यास पर। –

+0

हाय - इस @ वाडावो के लिए धन्यवाद - यह काम करता है, लेकिन मैंने 'पथ। हैस एक्सटेंशन' का उपयोग किया है जो प्रभावी रूप से वही काम करता है। – LiverpoolsNumber9

+0

आप 'FileInfo' कक्षा –

0

यहां मेरे समाधान यह सही करने के लिए है ;)

 var inputString = ("http://ask.com/pic.JPG http://aSk.com/pIc.JPG " 
     + "http://ask.com/pic.jpg " 
     + "http://yoursite.com/contact " 
     + "http://yoursite.com/contact?query=value " 
     + "http://yoursite.com/contact?query=value.value " 
     + "http://yoursite.com/contact/ " 
     + "http://yoursite.com/images/Logo.pnG " 
     + "http://yoursite.com/images/lOgo.pNg?query=value " 
     + "http://yoursite.com/images/logo.png?query=value.value " 
     + "http://yoursite.com/contact.is.sortof.valid " 
     + "http://mysite:123/contact.is.sortof.valid").Split(' '); 

     var restultString = ""; 

     foreach (var is1 in inputString) 
     { 
      restultString += (!string.IsNullOrEmpty(restultString) ? " " : "") + 
        (Path.HasExtension(is1) ? Path.ChangeExtension(is1, Path.GetExtension(is1).ToLower()) : is1); 
     }