2009-02-06 15 views

Respuesta

13

Dado que una ruta sin dos barras diagonales inversas en la primera y la segunda posición es, por definición, no una ruta UNC, esta es una forma segura de tomar esta determinación.

Una ruta con una letra de unidad en la primera posición (c :) es una ruta local rooteada.

Una ruta sin cualquiera de estas cosas (myfolder \ blah) es una ruta local relativa. Esto incluye una ruta con solo una barra (\ myfolder \ blah).

+0

Debería marcar al menos para "\\" para iniciar la ruta, como "\ this \ is \ not \ a \ unc \ path" (no es algo especialmente bueno tener en la ruta, pero no es un UNC independientemente). –

+0

Muy bien. He modificado mi respuesta. – TheSmurf

+1

¿qué ocurre con los sistemas localizados donde el separador de ruta es diferente? p.ej. ¥ en los sistemas japoneses –

10

La aproximación más exacta va a ser el uso de un código de interoperabilidad 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); 

A continuación, podría llamarlo así:

/// <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 tiene la mejor respuesta usando purely managed code.

+0

¡Perfecto! Muchas gracias – om471987

11

probar este método de extensión

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

El objeto DriveInfo no se puede usar para rutas UNC. Pero si lo cambio para que sea una extensión de DirectoryInfo, y use FullName en lugar de Name, parece que funciona bien. –

+1

¿Hay alguna razón para no usar 'DirectoryInfo.DriveType == DriveType.Network' en lugar de' Uri.TryCreate'? – larsmoa

1

Ésta es mi versión:

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

La ventaja de esta versión sobre la versión @JaredPars es que este es compatible con cualquier ruta, no sólo DriveInfo.

4

Un truco que he encontrado es utilizar dInfo.FullName.StartsWith(String.Empty.PadLeft(2, IO.Path.DirectorySeparatorChar)) donde DINFO es un objeto DirectoryInfo - si el registro de entrada devuelve True, entonces es una ruta UNC, de lo contrario es una ruta local

+4

O '.StartsWith (cadena nueva (Path.DirectorySeparatorChar, 2))'. – jnm2

0

Quizás esta respuesta puede ser útil para alguien que quiere validar único servidor UNC + cuota + subdirectorios, por ejemplo ruta a la red como repositorio

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

Usar la siguiente expresión regular:

^\\\\([A-Za-z0-9_\-]{1,32}[/\\]){0,10}[A-Za-z0-9_\-]{1,32}$ 
  • reemplazar 32 (2 veces) con longitud máxima permitida de nombre de servidor/directorio
  • reemplazar 10 con máximo permitido profundidad de trayectoria (máximo recuento de directorios)
  • extender [A-Za-z0-9_\-] (2 veces) si usted es m emitir algún carácter permitido en el nombre del servidor/directorio

Lo he probado correctamente. ¡Disfrutar!

Cuestiones relacionadas