c# - para - plantillas de visual studio
Usando C#, cómo saber si una carpeta está ubicada en una red o no (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.
¿Cómo puedo hacer eso?
Basado en las respuestas de @jgauffin y @Daniel, puedes probar 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;
}
Pruebe lo siguiente desde 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:
- Las rutas que comienzan 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 asignada a una letra de unidad a través del comando SUBST de Microsoft MS-DOS o la función DefineDosDevice
Puede usar el siguiente método para obtener la ruta UNC para una carpeta. No es exactamente lo que estás 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;
}
Si está hablando de una unidad de red mapeada, puede usar la propiedad DriveType
:
var driveInfo = new DriveInfo("S:/");
if(driveInfo.DriveType == DriveType.Network)
// do something
Respuesta original de otra pregunta SO. Compruebe si la ruta está en la red .
Use PathIsNetworkPath ( referencia de Pinvoke):
class Program
{
[DllImport("shlwapi.dll")]
private static extern bool PathIsNetworkPath(string pszPath);
static void Main(string[] args)
{
Console.WriteLine(PathIsNetworkPath("i:/Backup"));
}
}
var dirInfo = new DirectoryInfo(yourPath);
var driveInfo = new DriveInfo(dirInfo.Root);
if (driveInfo.DriveType == DriveType.Network)
Console.WriteLine("Is a network drive!");