c# - remoto - Método para determinar si la cadena de ruta es una máquina local o remota
ejemplo cadena conexion sql server (7)
¿Cuál es la mejor manera, usando C # u otro lenguaje .NET, para determinar si una cadena de ruta de archivo está en la máquina local o en un servidor remoto?
Es posible determinar si una cadena de ruta es UNC usando lo siguiente:
new Uri(path).IsUnc
Eso funciona muy bien para rutas que comienzan con C: / u otra letra de unidad, pero ¿qué pasa con rutas como:
//machinename/sharename/directory
//10.12.34.56/sharename/directory
... donde ambos se refieren a la máquina local: estas son rutas UNC pero siguen siendo locales.
No sé si hay una forma más eficiente de hacerlo, pero parece funcionar para mí:
IPAddress[] host;
IPAddress[] local;
bool isLocal = false;
host = Dns.GetHostAddresses(uri.Host);
local = Dns.GetHostAddresses(Dns.GetHostName());
foreach (IPAddress hostAddress in host)
{
if (IPAddress.IsLoopback(hostAddress))
{
isLocal = true;
break;
}
else
{
foreach (IPAddress localAddress in local)
{
if (hostAddress.Equals(localAddress))
{
isLocal = true;
break;
}
}
if (isLocal)
{
break;
}
}
}
Versión .NET 3.5 de la respuesta de Eric con un control adicional si el host existe:
private bool IsLocalHost(string input)
{
IPAddress[] host;
//get host addresses
try { host = Dns.GetHostAddresses(input); }
catch (Exception) { return false; }
//get local adresses
IPAddress[] local = Dns.GetHostAddresses(Dns.GetHostName());
//check if local
return host.Any(hostAddress => IPAddress.IsLoopback(hostAddress) || local.Contains(hostAddress));
}
Así es como lo hice.
public static bool IsLocal(DirectoryInfo dir)
{
foreach (DriveInfo d in DriveInfo.GetDrives())
{
if (string.Compare(dir.Root.FullName, d.Name, StringComparison.OrdinalIgnoreCase) == 0) //[drweb86] Fix for different case.
{
return (d.DriveType != DriveType.Network);
}
}
throw new DriveNotFoundException();
}
Tal vez
var isLocal = Dns.GetHostName() == _host || Dns.GetHostEntry(Dns.GetHostName()).AddressList.Any(i => i.ToString().Equals(_host));
Lo siguiente debería funcionar para las unidades mapeadas y para las rutas UNC.
private static bool IsLocalPath(String path)
{
if (!PathIsUNC(path))
{
return !PathIsNetworkPath(path);
}
Uri uri = new Uri(path);
return IsLocalHost(uri.Host); // Refer to David''s answer
}
[DllImport("Shlwapi.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool PathIsNetworkPath(String pszPath);
[DllImport("Shlwapi.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool PathIsUNC(String pszPath);
Aquí es cómo abordé una necesidad similar.
internal static bool IsFileRemote(string path)
{
if (String.IsNullOrEmpty(path))
{
return false;
}
if (new Uri(path).IsUnc)
{
return true;
}
if (new DriveInfo(path).DriveType == DriveType.Network)
{
return true;
}
return false;
}
No conozco un solo método para verificar eso. Sin embargo, puede comparar la propiedad Host
de Uri con el nombre de host local o la dirección IP.
Puede obtener el nombre de la máquina local usando:
string hostName = System.Net.Dns.GetHostName()
A continuación, puede obtener una matriz de direcciones IP pasando esa cadena a:
System.Net.IPAddress[] addresses = System.Net.Dns.GetHostAddresses(hostName);
Encienda la propiedad UriHostNameType.Dns
''s HostNameType
, probablemente UriHostNameType.Dns
o UriHostNameType.IPv4
, para que coincida con el nombre o la dirección IP.