2013-07-18 30 views
7

Tôi có thể thực hiện một lần đọc tới đĩa bằng cụm từ thông dụng thay vì thực hiện ba lần này không?Tham khảo tập hợp đường dẫn tệp bằng biểu thức chính quy

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

Lý do bạn muốn làm điều này là gì? Hiệu suất? –

Trả lời

1

Bạn có thể có được một danh sách tất cả các tập tin ở vị trí thư mục và sử dụng LINQ để tìm ra con đường, sử dụng Directory.EnumerateFiles:

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

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

Tùy thuộc vào số lượng file nó thể sản xuất tốt hơn kết quả hơn giải pháp của bạn.

4

Giả sử bạn không quan tâm mà bạn nhấn:

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; 
    } 
} 

Nếu path không phải là null bạn tìm thấy một.

+0

Tôi nhận được "Ký tự không hợp lệ trong đường dẫn" cho phương pháp này. –

+0

@MikeFlynn: Rất tiếc, phương pháp sai. Sẽ nâng cấp. – Guvante

0

Đây là chi tiết của một sửa đổi trên @ ý tưởng Oded của hơn bất cứ điều gì khác, nhưng tôi có thể muốn làm điều gì đó như thế này:

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

Hãy thử một cái gì đó như thế này (chỉ hoạt động trong .NET4 và sau):

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

Điều đó cho bạn biết nếu một trong các tệp tồn tại, nhưng không phải là tệp nào. Rõ ràng là OP muốn đường dẫn đến tệp hiện có. –

0

Tính năng này có phù hợp với bạn không? Nó sử dụng regex và giữ quyền ưu tiên của trận đấu

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; 

Nếu tôi được co lại nó một chút (2 câu)

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

Rất nhiều câu trả lời tốt, nhưng tôi đã đi với cách tiếp cận này kết hợp một cặp vợ chồng .

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; 
} 
Các vấn đề liên quan