2008-12-09 4 views
30

Was ist der beste Weg, um mit C# oder einer anderen .NET-Sprache festzustellen, ob sich eine Dateipfadzeichenfolge auf dem lokalen Computer oder einem Remote-Server befindet?Methode zum Ermitteln, ob die Pfadzeichenfolge lokal oder remote ist

Es ist möglich, zu bestimmen, ob eine Pfadzeichenfolge ist die UNC mit folgenden:

new Uri(path).IsUnc 

Das für Pfade große Werke, die mit C beginnen: \ oder anderen Laufwerksbuchstaben, aber was Pfade wie:

\\machinename\sharename\directory 
\\10.12.34.56\sharename\directory 

... wobei beide sich auf die lokale Maschine beziehen - dies sind UNC-Pfade, aber immer noch lokal.

Antwort

15

Sie wissen nicht, ob es dies zu tun, ein effizienter Weg ist, aber es scheint für mich zu arbeiten:

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

Funktioniert nicht mit zugeordneten Laufwerken. –

+1

Funktioniert auch nicht, wenn die URI, die Sie suchen, entweder ausgeschaltet oder nicht verbunden ist (oder Ihr eigener PC nicht angeschlossen ist.) – midspace

+0

Es ist keine vollständige Lösung – om471987

0

Ich kenne keine einzige Methode, um das zu überprüfen. Sie können die Uri-Eigenschaft Host jedoch entweder mit dem lokalen Hostnamen oder der IP-Adresse vergleichen.

Sie können die lokalen Computernamen erhalten mit:

string hostName = System.Net.Dns.GetHostName() 

Sie dann eine Reihe von IP-Adressen durch die Zeichenfolge bekommen kann vorbei an:

System.Net.IPAddress[] addresses = System.Net.Dns.GetHostAddresses(hostName); 

Schalter auf der HostNameType Unterkunft Uri, wahrscheinlich UriHostNameType.Dns oder UriHostNameType.IPv4, um entweder den Namen oder die IP-Adresse zu finden.

21

Dies ist, wie ich es tat.

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(); 
    } 
+1

verwenden, neue System.IO.DriveNotFoundException() werfen ; – midspace

12

.NET 3.5-Version von Eric Antwort mit einer zusätzlichen Prüfung, ob der Host vorhanden ist:

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

Vielleicht

var isLocal = Dns.GetHostName() == _host || Dns.GetHostEntry(Dns.GetHostName()).AddressList.Any(i => i.ToString().Equals(_host)); 
6

Die folgende Beschreibung ist für zugeordnete Laufwerke und für UNC-Pfade arbeiten.

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); 
5

Hier ist, wie ich ein ähnliches Bedürfnis adressiert.

Verwandte Themen