2011-08-10 20 views
6

Usando C#, me gustaría que mi aplicación me devuelva si una carpeta (con una ruta ya conocida) está ubicada en una red o en mi computadora.Usando C#, cómo saber si una carpeta está ubicada en una red o no

¿Cómo puedo hacer eso?

+1

¿Usted está preguntando por rutas UNC? ¿Qué pasa con '\\ localhost \ something', o una unidad de red mapeada? – SLaks

+3

posible duplicado de [Comprobar si la ruta está en la red] (http://stackoverflow.com/questions/2243569/check-if-path-is-on-network) –

+0

Para ambos casos, rutas UNC y unidad de red asignada. – MyrR

Respuesta

6

Si usted está hablando de una unidad de red, puede utilizar el DriveInfo 's DriveType property:

var driveInfo = new DriveInfo("S:\"); 
if(driveInfo.DriveType == DriveType.Network) 
    // do something 
0
var dirInfo = new DirectoryInfo(yourPath); 
var driveInfo = new DriveInfo(dirInfo.Root); 
if (driveInfo.DriveType == DriveType.Network) 
    Console.WriteLine("Is a network drive!"); 
+0

Funciona para rutas locales y rutas de red asignadas pero no para rutas UNC – Jamiec

0

Pruebe lo siguiente de Shell Lightweight Utility API:

class Class 
{ 
    [DllImport("shlwapi.dll")] 
    private static extern bool PathIsNetworkPath(string Path); 

    [STAThread] 
    static void Main(string[] args) 
    { 
     string strPath = "D:\\Temp\\tmpfile.txt"; 
     bool blnIsLocalPath = IsLocalPath(strPath); 
     Console.WriteLine(blnIsLocalPath.ToString()); 
     Console.ReadLine(); 
    } 

    private static bool IsLocalPath(string Path) 
    { 
     return !PathIsNetworkPath(Path); 
    } 
} 

Cosas a tener en cuenta:

  • caminos que piden con dos caracteres de barra invertida (\) se interpretan como rutas de Convención de nomenclatura universal (UNC).
  • Las rutas que comienzan con una letra seguida de dos puntos (:) se interpretan como una unidad de red montada. Sin embargo, PathIsNetworkPath no puede reconocer una unidad de red a una letra de unidad a través del sistema de Microsoft MS-DOS SUBST o la función DefineDosDevice
0

Puede utilizar el método folowing a obtener la ruta UNC para una carpeta. No es exactamente lo que está buscando, pero podría ser útil

public static string GetUniversalPath(string folderPath) 
    { 
     if (String.IsNullOrEmpty(folderPath) || folderPath.IndexOf(":") > 1) 
      return folderPath; 

     if (folderPath.StartsWith("\\")) 
     { 
      return folderPath; 
     } 
     ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT RemoteName FROM win32_NetworkConnection WHERE LocalName = '" + folderPath.Substring(0, 2) + "'"); 
     foreach (ManagementObject managementObject in searcher.Get()) 
     { 
      string remoteName = managementObject["RemoteName"] as String; 
      if (!String.IsNullOrEmpty(remoteName)) 
      { 
       remoteName += folderPath.Substring(2); 
       return remoteName; 
      }    
     } 
     return folderPath; 
    } 
3

Basado en @jgauffin y respuestas @ Daniel, podría intentar este pequeño truco:

private static bool IsNetwork(String path) 
{ 
    if (path.StartsWith(@"\\")) 
     return true; 
    var dir = new DirectoryInfo(path); 
    var drive = new DriveInfo(dir.Root.ToString()); 
    return drive.DriveType == DriveType.Network; 
} 
+0

Esta es la única solución que cubre rutas de red asignadas y UNC. Suficientemente bueno para mi. – NielW

Cuestiones relacionadas