2008-12-09 34 views
30

Cách tốt nhất là sử dụng ngôn ngữ C# hoặc ngôn ngữ .NET khác để xác định xem chuỗi đường dẫn tệp có nằm trên máy cục bộ hoặc máy chủ từ xa không?Phương pháp xác định xem chuỗi đường dẫn là máy cục bộ hoặc từ xa

Có thể để xác định xem một chuỗi đường dẫn UNC sử dụng như sau:

new Uri(path).IsUnc 

đó làm việc tuyệt vời cho đường dẫn bắt đầu với C: \ hoặc ký tự ổ đĩa khác, nhưng những gì về con đường như:

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

... trong đó cả hai đều tham chiếu đến máy cục bộ - đây là các đường dẫn UNC nhưng vẫn là cục bộ.

Trả lời

15

Không biết nếu có một cách hiệu quả hơn để làm điều này, nhưng có vẻ như để làm việc cho tôi:

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

Không hoạt động với ổ đĩa được ánh xạ. –

+1

Cũng không hoạt động nếu uri bạn đang tìm kiếm bị tắt hoặc không kết nối (hoặc PC của bạn không được kết nối.) – midspace

+0

Nó không phải là giải pháp hoàn chỉnh – om471987

0

Tôi không biết một phương pháp nào để kiểm tra điều đó. Tuy nhiên, bạn có thể so sánh thuộc tính Host của Uri với tên máy chủ cục bộ hoặc địa chỉ IP.

Bạn có thể có được tên máy tính cục bộ sử dụng:

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

Sau đó bạn có thể nhận được một loạt các địa chỉ IP bằng cách thông qua chuỗi đó để:

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

Chuyển về sở hữu HostNameType của Uri, có lẽ UriHostNameType.Dns hoặc UriHostNameType.IPv4, để khớp với tên hoặc địa chỉ IP.

21

Đây là cách tôi đã làm nó.

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

sử dụng, ném System.IO.DriveNotFoundException mới() ; – midspace

12

.NET 3.5 phiên bản của câu trả lời của Eric với một kiểm tra thêm liệu máy chủ tồn tại:

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

lẽ

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

Sau đây nên làm việc cho các ổ đĩa ánh xạ và các đường dẫn 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

Đây là cách tôi giải quyết một nhu cầu tương tự.

 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; 
    } 
Các vấn đề liên quan