2015-07-02 83 views
2

你好我正在写一个应用程序,用户可以输入一个目录来存储一些文件。如何ping映射的驱动器

如果他进入mashine上的目录,程序正在运行,我可以使用他输入的路径。

如果他进入网络上的目录是这样的:192.168.xxx.xxx ..., 我可以ping,如果pingable使用此路径。

但是如果用户有映射的驱动器并输入类似Y:\ work ...的东西呢?在.NET平类有一个发送方法,我使用的是这样的:

try{ 
    Ping pinger = new Ping(); 
    PingReply reply = pinger.Send(NetworkIP); 
} catch (PingException) { 
    // Discard PingExceptions and return false; 
} 

但如果NetworkIP是Y:\或东西,它抛出一个PingException即使驱动器应该可用。

有人知道我能如何解决这个问题吗?也许我可以以某种方式获得驱动器的IP地址并使用它?

感谢您的帮助

回答

2

你可以只检查,如果该网络驱动器已准备就绪。
.NET框架中有一个DriveInfo类,它指示驱动器是否准备就绪(如果CD已插入CD ROM设备中,或者可移动存储器已准备好用于IO,这也适用于网络驱动器)。

我很快测试这与一个小PowerShell脚本来验证这一点,这是我的输出:

Name    : Y:\ 
DriveType   : Network 
DriveFormat  : 
IsReady   : False 
AvailableFreeSpace : 
TotalFreeSpace  : 
TotalSize   : 
RootDirectory  : Y:\ 
VolumeLabel  : 

Name    : Z:\ 
DriveType   : Network 
DriveFormat  : HGFS 
IsReady   : True 
AvailableFreeSpace : 420309352448 
TotalFreeSpace  : 420309352448 
TotalSize   : 500105736192 
RootDirectory  : Z:\ 
VolumeLabel  : Shared Folders 

您可以使用MSDN文档中给出的例子来编写应用程序的代码可能像这样(没有测试但尚未应该工作):

using System; 
using System.IO; 

class MyClass { 
    public bool CheckNetworkDrive(String name) { 
     bool result = false; 
     DriveInfo[] drives = DriveInfo.GetDrives(); 
     foreach (DriveInfo d in drives) { 
      if (d.Name == name) { 
       result = d.IsReady; 
      } 
     } 
     return result; 
    } 
} 
0

您也可以使用net use找到映射的网络驱动器的IP或计算机名

Process process = new Process(); 
process.StartInfo.UseShellExecute = false; 
process.StartInfo.RedirectStandardOutput = true; 
process.StartInfo.FileName = "cmd.exe"; 
process.StartInfo.Arguments = "/c net use"; 
process.Start(); 
string output = process.StandardOutput.ReadToEnd(); 
process.WaitForExit(); 


var line = output.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries) 
        .Where(x => x.Contains("U:")).FirstOrDefault(); 
if (!string.IsNullOrEmpty(line)) 
{ 
    var host = line.Substring(line.IndexOf("\\"), line.Substring(line.IndexOf("\\")).IndexOf(" ")).Split(new[]{'\\'}, StringSplitOptions.RemoveEmptyEntries).FirstOrDefault(); 
    Ping pinger = new Ping(); 
    PingReply reply = pinger.Send(host); 
}