2012-11-01 21 views
12

我有一個任務寫一個對象,可以接收不同類型的路徑/ URL,並返回它是什麼類型的路徑/ URL。例如路徑可以是物理,相對,絕對和其他路徑

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#如果它是物理路徑,相對網址或絕對網址?

我認爲知道它是相對的還是絕對的uri是相對容易的,但是如何知道它是否是UNC路徑?我試圖使用Uri對象和它的IsUnc屬性,但它並不真正幫助我...對於c:\ temp它返回false,爲「/ temp」,「temp /」和「temp」它拋出格式不正確的例外。在.NET 3.5中是否存在可以幫助我的任何內置對象,或者我可以使用什麼算法來確定路徑的類型?

+0

那麼, 「/ TEMP」 的確不是一個URI的。什麼是你想要檢查的確切格式?如果只是路徑和URI,您可以先區分它們,併爲每個技術應用不同的技術。 – Vlad

+0

爲什麼「/ temp」不是有效的URI?我認爲它可以解釋爲相對的。我需要檢查所有格式,並確定它是什麼類型...是UNC路徑還是URI路徑...我如何區分它們? –

+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:\ TEMP' 是一個文件URI
'\\溫度' 爲UNC路徑
'溫度' 是一個相對URI
'/ Temp'是相對URI
'〜/ Temp'是相對URI
'file:// C:/ Temp'是一個文件URI
'文件://臨時' 是一個UNC路徑
的 'http://東西/溫度' 是一個絕對URI

+0

謝謝,但對於值'C:\ Temp','\\ Temp','file:// C:/ Temp'和'file:// Temp'我的對象應該返回「PhysicalPath」而不是URI。 –

+0

然後更改'IsFile'分支以打印「PhysicalPath」而不是「UNC路徑」和「文件URI」。 –

+0

System.Uri將協議相對視爲相對,但在大多數安全上下文中,這些應視爲絕對路徑。所以'http:// gmail.com'是絕對的,但是'// gmail。com'是相對的,儘管它要去一個不同的領域。 – yzorg