您好我正在编写一个应用程序,用户可以在其中输入用于存储某些文件的目录。
如果他在程序运行的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地址并使用它?
感谢您的帮助
答案 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);
}