2009-02-06 8 views

Répondre

13

Puisqu'un chemin sans deux barres obliques inverses dans les première et deuxième positions est, par définition, pas un chemin UNC, c'est un moyen sûr de faire cette détermination.

Un chemin avec une lettre de lecteur dans la première position (c :) est un chemin local racine.

Un chemin sans l'une de ces choses (myfolder \ blah) est un chemin local relatif. Cela inclut un chemin avec une seule barre oblique (\ myfolder \ blah).

+0

Vous devez vérifier au moins "\\" pour démarrer le chemin, comme "\ this \ is \ not \ a \ unc \ path" (ce n'est pas une bonne chose à avoir dans le chemin, mais ce n'est pas un UNC indépendamment). –

+0

Tout à fait raison. J'ai modifié ma réponse. – TheSmurf

+1

qu'en est-il des systèmes localisés où le séparateur de chemin est différent? par exemple. ¥ dans les systèmes japonais –

10

L'approche la plus précise va être en utilisant un code Interop de la 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); 

alors vous appeler comme ça:

/// <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 a la meilleure réponse à l'aide purely managed code.

+0

Parfait! Merci beaucoup – om471987

11

Essayez cette méthode d'extension

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'objet DriveInfo ne peut pas être utilisé pour les chemins UNC. Mais si je le change pour être une extension de DirectoryInfo et que j'utilise FullName au lieu de Name, cela semble fonctionner correctement. –

+1

Y a-t-il une raison pour ne pas utiliser 'DirectoryInfo.DriveType == DriveType.Network' au lieu de' Uri.TryCreate'? – larsmoa

1

Ceci est ma version:

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

L'avantage de cette version sur version @JaredPars est que ce chemin supporte tout, non seulement DriveInfo.

4

Une astuce que j'ai trouvé est d'utiliser dInfo.FullName.StartsWith(String.Empty.PadLeft(2, IO.Path.DirectorySeparatorChar)) où dinfo est un objet DirectoryInfo - si ce chèque retourne vrai, alors il est un chemin UNC, sinon il est un chemin local

+4

Ou '.StartsWith (nouvelle chaîne (Path.DirectorySeparatorChar, 2))'. – jnm2

0

Peut-être que cette réponse peut être utile à quelqu'un qui veut valider seul serveur UNC + partager + sous-répertoires, par exemple chemin au réseau référentiel comme

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

Utiliser l'expression rationnelle suivante:

^\\\\([A-Za-z0-9_\-]{1,32}[/\\]){0,10}[A-Za-z0-9_\-]{1,32}$ 
  • remplacer 32 (2 fois) avec la longueur maximale autorisée du nom serveur/répertoire
  • remplacer 10 avec la profondeur de trajet maximale autorisée (maximum nombre de répertoires)
  • étendre [A-Za-z0-9_\-] (2 fois) si vous êtes m émission d'un caractère autorisé dans le nom de serveur/répertoire

Je l'ai testé avec succès. Prendre plaisir!

Questions connexes