2009-02-06 18 views
18

Il modo più semplice per verificare se un percorso è un percorso UNC è ovviamente quello di verificare se il primo carattere nel percorso completo è una lettera o una barra rovesciata. Questa è una buona soluzione o potrebbero esserci problemi?Qual è il modo corretto per verificare se un percorso è un percorso UNC o un percorso locale?

Il mio problema specifico è che voglio creare un oggetto System.IO.DriveInfo se c'è una lettera di unità nel percorso.

risposta

13

Poiché un percorso senza due barre retroverse nella prima e nella seconda posizione è, per definizione, non un percorso UNC, questo è un modo sicuro per effettuare questa determinazione.

Un percorso con una lettera di unità nella prima posizione (c :) è un percorso locale con radice.

Un percorso senza nessuna di queste cose (myfolder \ blah) è un percorso locale relativo. Questo include un percorso con solo una singola barra (\ myfolder \ blah).

+0

Si dovrebbe verificare almeno "\\" per avviare il percorso, come "\ this \ is \ not \ a \ unc \ path" (non è una cosa particolarmente buona da avere nel percorso, ma non è un UNC a prescindere). –

+0

Giusto. Ho modificato la mia risposta. – TheSmurf

+1

E i sistemi localizzati in cui il separatore del percorso è diverso? per esempio. ¥ nei sistemi giapponesi –

10

L'approccio più accurato sta per essere utilizzando un codice di interoperabilità dal Shlwapi.dll

[DllImport("shlwapi.dll", CharSet = CharSet.Unicode)] 
[ResourceExposure(ResourceScope.None)] 
[return: MarshalAsAttribute(UnmanagedType.Bool)] 
internal static extern bool PathIsUNC([MarshalAsAttribute(UnmanagedType.LPWStr), In] string pszPath); 

Si potrebbe quindi chiamare in questo modo:

/// <summary> 
    /// Determines if the string is a valid Universal Naming Convention (UNC) 
    /// for a server and share path. 
    /// </summary> 
    /// <param name="path">The path to be tested.</param> 
    /// <returns><see langword="true"/> if the path is a valid UNC path; 
    /// otherwise, <see langword="false"/>.</returns> 
    public static bool IsUncPath(string path) 
    { 
     return PathIsUNC(path); 
    } 

@JaredPar ha la migliore risposta utilizzando purely managed code.

+0

Perfetto! Grazie mille – om471987

11

provare questo metodo di estensione

public static bool IsUncDrive(this DriveInfo info) { 
    Uri uri = null; 
    if (!Uri.TryCreate(info.Name, UriKind.Absolute, out uri)) { 
    return false; 
    } 
    return uri.IsUnc; 
} 
+4

L'oggetto DriveInfo non può essere utilizzato per i percorsi UNC. Ma se lo cambio come estensione a DirectoryInfo, e uso il FullName al posto di Name, sembra funzionare bene. –

+1

C'è un motivo per non usare 'DirectoryInfo.DriveType == DriveType.Network' invece di' Uri.TryCreate'? – larsmoa

1

Questa è la mia versione:

public static bool IsUnc(string path) 
{ 
    string root = Path.GetPathRoot(path); 

    // Check if root starts with "\\", clearly an UNC 
    if (root.StartsWith(@"\\")) 
    return true; 

    // Check if the drive is a network drive 
    DriveInfo drive = new DriveInfo(root); 
    if (drive.DriveType == DriveType.Network) 
    return true; 

    return false; 
} 

Il vantaggio di questa versione rispetto alla versione @JaredPars è che questo supporta qualsiasi percorso, non solo DriveInfo.

4

Un trucco che ho trovato è quello di utilizzare dInfo.FullName.StartsWith(String.Empty.PadLeft(2, IO.Path.DirectorySeparatorChar)) dove dinfo è un oggetto DirectoryInfo - se tale verifica restituisce True allora è un percorso UNC, altrimenti è un percorso locale

+4

Oppure '.StartsWith (nuova stringa (Path.DirectorySeparatorChar, 2))'. – jnm2

0

Forse questa risposta può essere utile a qualcuno che vuole validare solo server di UNC + quota + sottodirectory, ad esempio il percorso di rete repository come

  • \\Server1\Share1
  • \\Server2\Share22\Dir1\Dir2
  • \\Server3

Usare il seguente espressione regolare:

^\\\\([A-Za-z0-9_\-]{1,32}[/\\]){0,10}[A-Za-z0-9_\-]{1,32}$ 
  • sostituire 32 (2 volte), con lunghezza massima consentita del nome/directory del server di
  • sostituire 10 con massimo consentito di profondità percorso (massimo conteggio delle directory)
  • estendere [A-Za-z0-9_\-] (2 volte) se si m emettere qualche carattere consentito nel nome del server/directory

L'ho provato con successo. Godere!

Problemi correlati