2012-11-01 32 views
12

mam zadanie napisać obiekt, który może odbierać różne typy ścieżek/URL i zwraca jaki rodzaj ścieżki/URL jest. Na przykład ścieżka może byćścieżki fizyczne, względne, bezwzględne i inne

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 

... i tak dalej.

Jak mogę sprawdzić w C# czy to fizyczne, ścieżkę względną lub bezwzględną URL, adres URL?

myślę, że to stosunkowo łatwo poznać, czy to absolutna czy względna uri, ale jak wiem, czy jest to ścieżka UNC?

Próbowałem użyć obiektu Uri i jego własności IsUnc, ale tak naprawdę nie pomaga mi .... dla c: \ temp zwraca false, dla "/ temp", "temp /" i "temp" to wyrzuca wyjątek, że format jest niepoprawny. Czy istnieje jakiś obiekt wbudowany w .NET 3.5, który może mi pomóc w tym lub jaki algorytm mogę użyć do określenia typu ścieżki?

+0

No "/ temp" to rzeczywiście nie URI w ogóle. Jaki jest dokładny format, który chcesz sprawdzić? Jeśli są to tylko ścieżki i identyfikatory URI, możesz je najpierw rozróżnić i zastosować różne techniki dla każdego z nich. – Vlad

+0

Dlaczego "/ temp" nie jest prawidłowym identyfikatorem URI? Myślę, że można to zinterpretować jako relatywne. Muszę sprawdzić wszystkie te formaty i zdecydować, jaki to jest ... czy to jest ścieżka UNC czy ścieżka URI ... jak mogę je rozróżnić? –

+0

Cóż, http://tools.ietf.org/html/rfc3986. Nie zaczyna się od schematu, na przykład (http: lub plik: zrobiłby). – Vlad

Odpowiedz

28

Spróbuj tego:

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

wyjściowa:

'C: \ Temp' jest plik URI
'\\ Temp' jest ścieżką UNC
'Temp' jest względny URI
'/ Temp' jest względnym URI
'~/Temp' jest względnym URI
'file: // C:/Temp' to plik URI
'file: // Temp' jest ścieżka UNC
'http: // coś/Temp' to absolutny URI

+0

Dzięki, ale dla wartości "C: \ Temp", "\\ Temp", "file: // C:/Temp" i "file: // Temp" mój obiekt powinien zwrócić "PhysicalPath", a nie URI. –

+0

Następnie zmień gałąź "IsFile", aby wydrukować "PhysicalPath" zamiast "UNC path" i "file URI". –

+0

System.Uri traktuje względny protokół jako relatywny, ale w większości kontekstów bezpieczeństwa należy je traktować jak absolutną ścieżkę. Tak więc "http: // gmail.com" jest absolutny, ale '// gmail.com' jest względne, mimo że przechodzi do innej domeny. – yzorg

Powiązane problemy