2015-07-02 4 views
2

Здравствуйте, я пишу приложение, в котором пользователь может ввести каталог для хранения некоторых файлов.Как выполнить ping сопоставленный диск

Если он вошел в каталог машины, программа работает, я могу просто использовать введенный вами путь.

В случае, если он ввел каталог в сети следующим образом: 192.168.xxx.xxx ..., Я могу выполнить ping, и если pingable использовать этот путь.

Но что, если пользователь имеет подключенный диск и вводит что-то вроде Y: \ work ...? Класс .Net Ping имеет отправляющий метод, я использую это так:

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

Но если NetworkIP является Y: \ или что-то он бросает PingException даже если диск должен быть доступен.

Кто-нибудь знает, как я могу это исправить? Может быть, я смогу получить IP-адрес диска как-то и использовать его вместо этого?

спасибо вам помочь

ответ

2

Вы можете просто проверить, что сетевой диск готов.
В .NET Framework есть класс , который указывает, готов ли диск (если компакт-диск вставлен в устройство CD-ROM или если съемное хранилище готово для ввода-вывода, что также относится к сетевым дискам).

Я быстро проверил это с небольшим скриптом 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); 
} 
Смежные вопросы