2013-07-18 4 views
7

क्या मैं इसे तीन बार करने के बजाय नियमित अभिव्यक्ति के साथ डिस्क पर पढ़ सकता हूं?एक नियमित अभिव्यक्ति का उपयोग कर फ़ाइल पथों का एक सेट संदर्भ

var path = HttpContext.Current.Server.MapPath(string.Format("~/Assets/Images/{0}.png", id)); 

if (!File.Exists(path)) 
{ 
    path = HttpContext.Current.Server.MapPath(string.Format("~/Assets/Images/{0}.jpg", id)); 

    if (!File.Exists(path)) 
    { 
     path = HttpContext.Current.Server.MapPath(string.Format("~/Assets/Images/{0}.gif", id)); 
+0

ऐसा करने के लिए आपका क्या कारण है? प्रदर्शन? –

उत्तर

1

आप निर्देशिका स्थान में सभी फ़ाइलों की एक सूची प्राप्त और पथ को खोजने के लिए LINQ का उपयोग कर सकते, का उपयोग कर Directory.EnumerateFiles:

var files = Directory.EnumerateFiles(Server.MapPath("~/Assets/Images/")); 

if(files.Contains(string.Format("{0}.png", id)) 
{ 
} 

फ़ाइलों की संख्या पर निर्भर करता है यह बेहतर उत्पादन हो सकता है आपके समाधान से परिणाम।

4

मान लिया जाये कि आप परवाह नहीं है जो आप हिट:

using System.IO 

string imagesPath = HttpContext.Current.Server.MapPath("~/Assets/Images"); 
string path = null; 
foreach (var filePath in Directory.GetFiles(imagesPath, id + ".*")) 
{ 
    switch (Path.GetExtension(filePath)) 
    { 
     case ".png": 
     case ".jpg": 
     case ".gif": 
      path = filePath; 
      break; 
    } 
} 

तो pathnull नहीं है आप एक मिल गया।

+0

मुझे इस दृष्टिकोण के लिए "पथ में अवैध पात्र" मिलते हैं। –

+0

@ माइकफ्लिन: ओह, गलत विधि। अपडेट करूंगी। – Guvante

0

यह किसी और चीज से @ Oded के विचार पर एक संशोधन के और अधिक है, लेकिन मैं होने की संभावना कुछ इस तरह करते हैं:

var extensions = new HashSet<string>(StringComparer.OrdinalIgnoreCase) 
    { ".png", ".gif", ".jpg", ".bmp" }; 

var firstMatchingPath = Directory.EnumerateFiles(Server.MapPath("~/Assets/Images/")) 
    .Where(s => extensions.Contains(Path.GetExtension(s)) 
    .FirstOrDefault(); 
2

कुछ इस तरह (केवल .NET4 में काम करता है और उसके बाद) का प्रयास करें:

string folder = HttpContext.Current.Server.MapPath("~/Assets/Images/"); 
string[] extensions = { ".jpg", ".gif", ".png" }; 
bool exists = Directory.EnumerateFiles(folder, "*.*", SearchOption.TopDirectoryOnly) 
       .Any(f => extensions.Contains(Path.GetExtension(f))); 
+0

यह आपको बताता है कि फाइलों में से एक मौजूद है, लेकिन कौन सा नहीं। यह बहुत स्पष्ट है कि ओपी मौजूदा फाइल का पथ चाहता है। –

0

क्या यह आपके लिए काम करता है? इसके regex का उपयोग करने और मैच

var folderPath = HttpContext.Current.Server.MapPath(string.Format("~/Assets/Images")); 

var regex = new Regex(string.Format("{0}[.](png|jpg|gif)", id)); 

var fileInfo = new DirectoryInfo(folderPath) 
    .GetFiles() 
    .Where(w => regex.Match(w.Name).Success) 
    .OrderByDescending(o => o.Extension) 
    // Taking advantage of png jpg gif is reverse alphabetical order, 
    // take .OrderByDecending() out if you don't care which one gets found first 
    .FirstOrDefault(); 

var path = fileInfo != default(FileInfo) ? fileInfo.FullName : string.Empty; 

की प्राथमिकता में रखते हुए अगर मैं यह एक छोटे (2 बयान) हटना

var fileInfo = new DirectoryInfo(HttpContext.Current.Server.MapPath(string.Format("~/Assets/Images"))) 
    .GetFiles() 
    .Where(w => Regex.Match(w.Name, string.Format("{0}[.](png|jpg|gif)", id)).Success) 
    .OrderByDescending(o => o.Extension) 
    .FirstOrDefault(); 

var path = fileInfo != default(FileInfo) ? fileInfo.FullName : string.Empty; 
0

अच्छा जवाब का एक बहुत थे, लेकिन मैं इस दृष्टिकोण है कि एक जोड़े को जोड़ती है के साथ चला गया ।

var path = Directory.EnumerateFiles(HttpContext.Current.Server.MapPath("~/Assets/Images/"), string.Format("{0}.*", id), SearchOption.TopDirectoryOnly).FirstOrDefault(); 

switch (Path.GetExtension(path)) 
{ 
    case ".png": 
    case ".jpg": 
    case ".gif": 
     break; 
    default: 
     return; 
} 
संबंधित मुद्दे