2008-12-09 11 views
30

सी # या अन्य .NET भाषा का उपयोग करके सबसे अच्छा तरीका क्या है, यह निर्धारित करने के लिए कि कोई फ़ाइल पथ स्ट्रिंग स्थानीय मशीन या दूरस्थ सर्वर पर है या नहीं?यह निर्धारित करने का तरीका है कि पथ स्ट्रिंग स्थानीय या दूरस्थ मशीन

यह अगर एक रास्ता स्ट्रिंग का उपयोग यूएनसी है निर्धारित करने के लिए संभव है निम्नलिखित:

new Uri(path).IsUnc 

कि रास्तों कि सी के साथ शुरू करने के लिए महान काम करता है:

: \ या अन्य ड्राइव अक्षर है, लेकिन क्या तरह रास्तों के बारे में
\\machinename\sharename\directory 
\\10.12.34.56\sharename\directory 

... जहां दोनों स्थानीय मशीन का संदर्भ लेते हैं - ये यूएनसी पथ हैं लेकिन अभी भी स्थानीय हैं।

उत्तर

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

मैप किए गए ड्राइव के साथ काम नहीं करता है। –

+1

यदि आप जिस यूरी को देख रहे हैं, वह भी काम नहीं करता है या तो कनेक्ट नहीं हुआ है, या कनेक्ट नहीं है (या आपका स्वयं का पीसी कनेक्ट नहीं है।) – midspace

+0

यह एक पूर्ण समाधान नहीं है – om471987

0

मुझे यह जांचने के लिए एक विधि की जानकारी नहीं है। हालांकि, आप उरी की Host संपत्ति को स्थानीय होस्ट नाम या आईपी पते से तुलना कर सकते हैं।

आप का उपयोग कर स्थानीय मशीन नाम प्राप्त कर सकते हैं:

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

फिर आप करने के लिए कि स्ट्रिंग पारित करके आईपी पतों की एक सरणी प्राप्त कर सकते हैं: उरी के HostNameType संपत्ति पर

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

स्विच, शायद नाम या आईपी पते से मेल खाने के लिए UriHostNameType.Dns या UriHostNameType.IPv4

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

उपयोग, नई प्रणाली को फेंक दें .IO.DriveNotFoundException() ; – midspace

12

एक अतिरिक्त जांच मेजबान मौजूद है या नहीं के साथ एरिक के जवाब का .NET 3.5 संस्करण:

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