2012-11-01 71 views
12

Tôi có nhiệm vụ viết đối tượng có thể nhận loại đường dẫn/url khác và trả về loại đường dẫn/url nào. Ví dụ: đường dẫn có thể làĐường dẫn vật lý, tương đối, tuyệt đối và các đường dẫn khác

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 

... v.v.

Tôi làm cách nào để đăng ký C# nếu đó là đường dẫn vật lý, url tương đối hoặc url tuyệt đối?

Tôi nghĩ rằng nó tương đối dễ dàng để biết nếu nó là tương đối hoặc tuyệt đối uri, nhưng làm thế nào để biết nếu đó là đường dẫn UNC?

Tôi đã cố gắng sử dụng đối tượng Uri và thuộc tính IsUnc, nhưng nó không thực sự giúp tôi .... cho c: \ temp nó trả về false, cho "/ temp", "temp /" và "temp" nó ném một ngoại lệ là định dạng không chính xác. Không tồn tại bất kỳ đối tượng được xây dựng trong .NET 3.5 có thể giúp tôi với điều này, hoặc những thuật toán tôi có thể sử dụng để xác định loại đường dẫn?

+0

Vâng, "/ temp" thực sự không phải là một URI cả. Định dạng chính xác bạn muốn kiểm tra là gì? Nếu đó chỉ là đường dẫn và URI, trước tiên bạn có thể phân biệt giữa chúng và áp dụng các kỹ thuật khác nhau cho từng loại. – Vlad

+0

Tại sao "/ temp" không phải là URI hợp lệ? Tôi nghĩ nó có thể được hiểu là họ hàng. Tôi cần phải kiểm tra tất cả các định dạng đó và quyết định loại đó là ... là đường dẫn UNC hay là đường dẫn URI ... làm cách nào tôi có thể phân biệt giữa chúng? –

+0

Vâng, http://tools.ietf.org/html/rfc3986. Nó không bắt đầu với một lược đồ, ví dụ (http: hoặc file: sẽ làm) – Vlad

Trả lời

28

Hãy thử điều này:

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

Output:

'C: \ Temp' là một file URI
'\\ Temp' là một đường dẫn UNC
'Temp' là một URI tương đối
'/ Temp' là URI tương đối
'~/Temp' là URI tương đối
'tệp: // C:/Temp' là tệp URI
'file: // Temp' là một đường dẫn UNC
'http: // cái gì đó/Temp' là một URI tuyệt đối

+0

Cảm ơn, nhưng các giá trị 'C: \ Temp', '\\ Temp', 'file: // C:/Temp' và 'file: // Temp' đối tượng của tôi sẽ trả về "PhysicalPath" chứ không phải URI. –

+0

Sau đó thay đổi nhánh 'IsFile' để in "PhysicalPath" thay vì "UNC path" và "file URI". –

+0

System.Uri xử lý giao thức tương đối là tương đối, nhưng trong hầu hết các ngữ cảnh bảo mật, chúng phải được xử lý như một đường dẫn tuyệt đối. Vì vậy, 'http: // gmail.com' là tuyệt đối, nhưng' // gmail.com' là tương đối, mặc dù nó sẽ đến một tên miền khác. – yzorg

Các vấn đề liên quan