2012-11-01 26 views
12

Ich habe eine Aufgabe, um ein Objekt zu schreiben, das einen anderen Typ von Pfaden/URLs erhalten kann und zurückgibt, welche Art von Pfad/URL es ist. Zum Beispiel kann der PfadPhysikalische, relative, absolute und andere Pfade

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 

... und so weiter sein.

Wie kann ich in C# einchecken, wenn es physischer Pfad, relative URL oder absolute URL ist?

Ich denke, es ist relativ einfach zu wissen, ob es relativ oder absolut uri ist, aber wie kann man wissen, ob es UNC-Pfad ist?

Ich habe versucht, Uri-Objekt und IsUnc-Eigenschaft zu verwenden, aber es hilft mir nicht wirklich .... für c: \ temp gibt es false zurück, für "/ temp", "temp /" und "temp" es wirft eine Ausnahme, dass das Format falsch ist. Gibt es irgendein eingebautes Objekt in .NET 3.5, das mir dabei helfen kann, oder welchen Algorithmus kann ich verwenden, um den Pfadtyp zu bestimmen?

+0

Gut "/ temp" ist in der Tat nicht überhaupt URI. Was ist das genaue Format, das Sie überprüfen möchten? Wenn es sich nur um Pfade und URIs handelt, können Sie zunächst zwischen ihnen unterscheiden und unterschiedliche Techniken anwenden. – Vlad

+0

Warum "/ temp" ist nicht gültig URI? Ich denke, es kann als relativ interpretiert werden. Ich muss alle diese Formate überprüfen und entscheiden, welcher Typ es ist ... ist es UNC-Pfad oder ist es URI-Pfad ... wie kann ich zwischen ihnen unterscheiden? –

+0

Nun, http://tools.ietf.org/html/rfc3986. Es startet nicht mit einem Schema, zum Beispiel (http: oder file: würde tun) – Vlad

Antwort

28

Try this:

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

Ausgang:

'C: \ Temp' ist eine Datei URI
'\\ Temp' ist ein UNC-Pfad
'Temp' ist ein relative URI
'/ Temp' ist eine relative URI
'~/Temp' ist eine relative URI
'file: // C:/Temp' ist eine Datei URI'File: // Temp' ist ein UNC-Pfad
'http: // etwas/Temp' ist ein absoluter URI

+0

Danke, aber für Werte 'C: \ Temp', '\\ Temp', 'Datei: // C:/Temp' und 'Datei: // Temp' mein Objekt sollte "PhysicalPath" und nicht URI zurückgeben. –

+0

Ändern Sie dann den 'IsFile'-Zweig, um "PhysicalPath" anstelle von "UNC-Pfad" und "Datei-URI" zu drucken. –

+0

System.Uri behandelt protokollrelativ als relativ, aber in den meisten Sicherheitskontexten sollten diese wie ein absoluter Pfad behandelt werden. Also 'http: // gmail.com' ist absolut, aber' // gmail.com ist relativ, auch wenn es in eine andere Domäne geht. – yzorg