2008-12-09 27 views
30

使用C#或其他.NET語言確定文件路徑字符串是位於本地計算機還是遠程服務器上的最佳方法是什麼?確定路徑字符串是本地計算機還是遠程計算機的方法

有可能確定一個路徑字符串是UNC使用下列內容:

new Uri(path).IsUnc 

,對於以C開始路徑的偉大工程:關於像路徑\或其他驅動器盤符,但什麼:

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

...其中兩個引用本地機器 - 這些是UNC路徑,但仍然是本地的。

回答

15

不知道是否有這樣做的更有效的方式,但它似乎爲我工作:

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

不適用於映射驅動器。 – 2011-11-14 12:19:17

+1

如果您正在查找的uri被關閉或未連接(或您自己的PC未連接),也不起作用。 – midspace 2011-12-18 23:49:43

0

我不知道有一種方法來檢查。但是,您可以將Uri的Host屬性與本地主機名或IP地址進行比較。

您可以通過獲取本地計算機名稱:

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

那麼你可以通過這個字符串來獲得IP地址的數組:

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

交換機上的URI HostNameType財產,可能UriHostNameType.DnsUriHostNameType.IPv4,以匹配名稱或IP地址。

21

這是我做到了。

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

.NET 3.5版本Eric的答覆和額外的檢查主機是否存在:

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

也許

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

下應該映射驅動器和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); 
5

這是我如何解決類似的需求。

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