2010-10-13 17 views
15

possibili percorsi virtuali:In C#, come si controlla se un percorso è virtuale o no?

/folder1/folder2/image.jpg 
~/folder1/folder2/image.jpg 
folder1/folder2/image.jpg 

Calcestruzzo percorso:

C:\folder1\folder2\image.jpg 
D:\folder1\folder2\image.jpg 
C:/folder1/folder2/image.jpg 
C:/folder1\folder2/image.jpg 

Come si fa a controllare se un percorso è virtuale o non in un modo che non è incline al fallimento? Il motivo per cui lo sto chiedendo è perché quando uso Server.MapPath() su un percorso concreto, genererà un'eccezione. Tuttavia, quello che sto passando a Server.MapPath() può essere uno degli esempi che ho fornito sopra e non so cosa sia prima del run-time.

+1

non Può essere controllato se inizia con 'X:'? – BrunoLM

risposta

17

Questo funziona abbastanza bene per me:

protected string GetPath(string path) 
{ 
    if (Path.IsPathRooted(path)) 
    { 
     return path; 
    } 

    return Server.MapPath(path); 
} 
+3

Questo non funzionerà per '/ folder1/folder2/image.jpg' che restituirà' true' – Jimbo

+0

Downvoted perché 'Path.IsPathRooted ("/folder1/folder2/image.jpg ");' restituisce 'true' e dovrebbe avere restituito invece 'false'; –

+0

Funzionerà in "alcuni casi", ma fallirà per i percorsi che iniziano con "/". – user1751825

1

Vorrei utilizzare Reflector per verificare cosa fa e come fa Server.MapPath(). :)

Un'alternativa potrebbe essere System.IO.Path.GetPathRoot() - se restituisce null, allora è un percorso relativo. Questo è un po 'un trucco, però, dal momento che non sa nulla dei percorsi web, quindi se funziona funziona per coincidenza.

8

Path.GetFullPath(string path) soddisfare le vostre esigenze? È possibile utilizzare tale metodo quindi confrontare se il percorso è cambiato.

if (path == Path.GetFullPath(path)) 
{ 
    // This is the full path (no changes) 
} 
else 
{ 
    // This is not the full path i.e. 'virtual' (changes) 
} 

Riferimento: http://msdn.microsoft.com/en-us/library/system.io.path.getfullpath.aspx

+0

sono nuovo qui e come posso cancellare la mia operazione? –

1

Il motivo per cui sto chiedendo è perché quando uso Server.MapPath() su un percorso concreto, verrà generata un'eccezione

Genera un'eccezione specifica per questo tipo di condizione o ne genera una generica? Se l'eccezione è specifica alla condizione che il percorso di input fosse concreto, rileverò quell'eccezione specifica nel codice. Anche se si tratta di un'eccezione generica, rileverei comunque questa eccezione, potresti non essere in grado di decodificare se è stata generata perché il percorso di input era virtuale, ma puoi almeno scrivere il tuo messaggio di eccezione includendo un avviso che potrebbe essere essere causato dal fatto che il percorso di input è virtuale.

Credo che questa sia la soluzione meno incline agli errori perché ci si basa sull'implementazione di Server.MapPath() per determinare le condizioni in cui non riesce, invece di provare a creare un wrapper ridondante che sta cercando di fare la stessa cosa . In futuro la funzionalità di MapPath() potrebbe cambiare e potrebbe effettivamente iniziare a supportare percorsi virtuali, quindi sarebbe sciocco che tu abbia il codice per impedirne effettivamente l'uso.

1

È possibile utilizzare la seguente espressione regolare ...

^(?:[a-zA-Z]:(?:\\|/)|\\\\) 

Se si vuole assicurarsi di avere sempre un percorso mappato. È possibile utilizzare il seguente one-liner ...

VB.Net

my_path = If(Regex.IsMatch(my_path, "^(?:[a-zA-Z]:(?:\\|/)|\\\\)"), my_path, Server.MapPath(my_path)) 

C#

my_path = Regex.IsMatch(my_path, @"^(?:[a-zA-Z]:(?:\\|/)|\\\\)") ? my_path : Server.MapPath(my_path); 

Questo dovrebbe funzionare correttamente con percorsi di unità regolari "c: \", così come i percorsi UNC "\\".

0

// Path.IsPathRooted ("/ folder1/folder2/image.jpg"); restituisce true

public void Main() 
     { 
      var path = @"/folder1/folder2/image.jpg"; 
      //is valid path? 
      if (!System.IO.Path.GetInvalidPathChars().Any(c => path.Contains(c.ToString()))) 
      { 

       if (IsAbsolutePhysicalPath(path)) 
       { 
        // This is the full path 
       } 
       else 
       { 
        // This is not the full path 
       } 

      } 
     } 
     private bool IsAbsolutePhysicalPath(string path) 
     { 
      if (path == null || path.Length < 3) 
       return false; 

      // e.g c:\foo 
      if (path[1] == ':' && IsDirectorySeparatorChar(path[2])) 
       return true; 

      // e.g \\server\share\foo or //server/share/foo 
      return IsUncSharePath(path); 
     } 
     private bool IsDirectorySeparatorChar(char ch) 
     { 
      return (ch == '\\' || ch == '/'); 
     } 

     private bool IsUncSharePath(string path) 
     { 
      // e.g \\server\share\foo or //server/share/foo 
      if (path.Length > 2 && IsDirectorySeparatorChar(path[0]) && IsDirectorySeparatorChar(path[1])) 
       return true; 
      return false; 

     } 

Riferimento: http://referencesource.microsoft.com/#System.Web/Util/UrlPath.cs,5e5cf20a50a858e2

+0

Questo può essere ottenuto molto più facilmente con un'espressione regolare. Una regex può fare esattamente la stessa cosa in 1 linea. – user1751825

Problemi correlati