2011-12-26 23 views
17

मैं प्रोग्रामेटिक रूप से यह जानना चाहता हूं कि मेरा एप्लिकेशन किसी नेटवर्क ड्राइव से चल रहा है या नहीं। ऐसा करने का सबसे आसान तरीका क्या है? इसे यूएनसी पथ (\\127.0.0.1\d$) और मैप किए गए नेटवर्क ड्राइव (जेड :) दोनों का समर्थन करना चाहिए।सी # में सबसे आसान तरीका यह पता लगाने के लिए कि कोई नेटवर्क ड्राइव से कोई ऐप चल रहा है या नहीं?

उत्तर

2

यह ऐसा करने का मेरे वर्तमान तरीका है, लेकिन यह लगता है जैसे वहाँ एक बेहतर तरीका होना चाहिए के लिए DriveInfo वर्ग का परीक्षण करें।

private bool IsRunningFromNetworkDrive() 
    { 
     var dir = AppDomain.CurrentDomain.BaseDirectory; 
     var driveLetter = dir.First(); 
     if (!Char.IsLetter(driveLetter)) 
      return true; 
     if (new DriveInfo(driveLetter.ToString()).DriveType == DriveType.Network) 
      return true; 
     return false; 
    } 
18

यह मैप किए गए ड्राइव मामले के लिए है। यह पता लगाने के लिए कि क्या ड्राइव एक नेटवर्क ड्राइव है या नहीं, आप DriveInfo कक्षा का उपयोग कर सकते हैं।

DriveInfo info = new DriveInfo("Z"); 
if (info.DriveType == DriveType.Network) 
{ 
    // Running from network 
} 

पूर्ण विधि और नमूना कोड।

public static bool IsRunningFromNetwork(string rootPath) 
{ 
    try 
    { 
     System.IO.DriveInfo info = new DriveInfo(rootPath); 
     if (info.DriveType == DriveType.Network) 
     { 
      return true; 
     } 
     return false; 
    } 
    catch 
    { 
     try 
     { 
      Uri uri = new Uri(rootPath); 
      return uri.IsUnc; 
     } 
     catch 
     { 
      return false; 
     } 
    } 
} 

static void Main(string[] args) 
{ 
    Console.WriteLine(IsRunningFromNetwork(System.IO.Path.GetPathRoot(AppDomain.CurrentDomain.BaseDirectory))); } 
1

यूएनसी पथ का उपयोग कर मामले में यह quitely सरल है - यूएनसी में होस्ट नाम और परीक्षण की जांच है कि यह स्थानीय होस्ट (127.0.0.1, :: 1, होस्टनाम, hostname.domain.local, कार्य केंद्र की ip- पते है) या नहीं।

पथ यूएनसी नहीं है, तो - पथ से ड्राइव अक्षर निकालने और उसके प्रकार

4
if (new DriveInfo(Application.StartupPath).DriveType == DriveType.Network) 
{  
    // here 
} 
0
DriveInfo m = DriveInfo.GetDrives().Where(p => p.DriveType == DriveType.Network).FirstOrDefault(); 
if (m != null) 
{ 
    //do stuff 
} 
else 
{ 
    //do stuff 
} 
0

मैं dotnetstep का समाधान है, जो बेहतर मेरी राय में है, क्योंकि यह अपवाद से बचा जाता है जब कोई मान्य पथ पारित हो जाता है पुन: व्यवस्थित, और यह एक अपवाद फेंकता है अगर वहाँ एक गलत पथ से पारित कर दिया है, जो सच या झूठी धारणा करने की अनुमति नहीं देता है।

//---------------------------------------------------------------------------------------------------- 
/// <summary>Gets a boolean indicating whether the specified path is a local path or a network path.</summary> 
/// <param name="path">Path to check</param> 
/// <returns>Returns a boolean indicating whether the specified path is a local path or a network path.</returns> 
public static Boolean IsNetworkPath(String path) { 
    Uri uri = new Uri(path); 
    if (uri.IsUnc) { 
    return true; 
    } 
    DriveInfo info = new DriveInfo(path); 
    if (info.DriveType == DriveType.Network) { 
    return true; 
    } 
    return false; 
} 

टेस्ट:

//---------------------------------------------------------------------------------------------------- 
/// <summary>A test for IsNetworkPath</summary> 
[TestMethod()] 
public void IsNetworkPathTest() { 
    String s1 = @"\\Test"; // unc 
    String s2 = @"C:\Program Files"; // local 
    String s3 = @"S:\"; // mapped 
    String s4 = "ljöasdf"; // invalid 

    Assert.IsTrue(RPath.IsNetworkPath(s1)); 
    Assert.IsFalse(RPath.IsNetworkPath(s2)); 
    Assert.IsTrue(RPath.IsNetworkPath(s3)); 
    try { 
    RPath.IsNetworkPath(s4); 
    Assert.Fail(); 
    } 
    catch {} 
}