如何ping映射驱动器

时间:2015-07-02 06:17:31

标签: c#

您好我正在编写一个应用程序,用户可以在其中输入用于存储某些文件的目录。

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

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

但是如果用户有一个映射的驱动器并且输入类似Y:\ work ...的内容怎么办? .Net Ping类有一个Send方法,我正在使用它:

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

但是如果NetworkIP是Y:\或者它会引发PingException,即使该驱动器应该可用。

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

感谢您的帮助

2 个答案:

答案 0 :(得分:2)

您可以检查网络驱动器是否准备就绪 .NET Framework中有一个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;
    }
}

答案 1 :(得分: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);
}