2012-11-01 41 views
12

Ho un compito di scrivere un oggetto che può ricevere un diverso tipo di percorsi/URL e restituire quale tipo di percorso/url è. Ad esempio il percorso può esserePercorsi fisici, relativi, assoluti e altri

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 

... e così via.

Come posso verificare in C# se è percorso fisico, url relativo o URL assoluto?

Penso che sia relativamente facile sapere se è uri relativo o assoluto, ma come sapere se si tratta di un percorso UNC?

Ho provato a utilizzare l'oggetto Uri e la sua proprietà IsUnc, ma in realtà non mi aiuta .... per c: \ temp restituisce false, per "/ temp", "temp /" e "temp" che genera un'eccezione che il formato non è corretto. Esiste un oggetto incorporato in .NET 3.5 che può aiutarmi con questo o quale algoritmo posso usare per determinare il tipo di percorso?

+0

Bene, "/ temp" è in effetti non è un URI a tutti. Qual è il formato esatto che vuoi controllare? Se si tratta solo di percorsi e URI, è possibile innanzitutto distinguere tra loro e applicare tecniche diverse per ciascuno. – Vlad

+0

Perché "/ temp" non è un URI valido? Penso che possa essere interpretato come relativo. Ho bisogno di controllare tutti questi formati e decidere di che tipo si tratta ... è il percorso UNC o il percorso URI ... come posso differenziarli? –

+0

Bene, http://tools.ietf.org/html/rfc3986. Non inizia con uno schema, ad esempio (http: o file: would do) – Vlad

risposta

28

Prova questo:

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

uscita:

'C: \ Temp' è un file URI
'\\ Temp' è un percorso UNC
'Temp' è un URI relativo
'/ Temp' è un URI relativo
'~/Temp' è un URI relativo
'file: // C:/Temp' è un file URI
'file: // Temp' è un percorso UNC
'http: // qualcosa/Temp' è un URI assoluto

+0

Grazie, ma per valori 'C: \ Temp', '\\ Temp', 'file: // C:/Temp' e 'file: // Temp' il mio oggetto dovrebbe restituire "PhysicalPath" e non l'URI. –

+0

Quindi modificare il ramo 'IsFile' per stampare "PhysicalPath" anziché "UNC path" e "file URI". –

+0

System.Uri considera il relativo protocollo come relativo, ma nella maggior parte dei contesti di sicurezza questi devono essere trattati come un percorso assoluto. Quindi 'http: // gmail.com' è assoluto, ma' // gmail.com' è relativo, anche se sta per un dominio diverso. – yzorg

Problemi correlati