2016-06-15 16 views
0

私は現在のコンピュータから定義されたコンピュータのリストにファイルのバッチをコピーするプログラムの一部を書いています。 これらのコンピュータが利用できない場合、コードにアクセスしようとして長時間ハングします。マシンが使用可能かどうかをチェックし、そうでない場合はスキップするためにC#にfunctionallityがありますか?リモートコンピュータが利用可能かどうかを確認するには?

MFWs = File.ReadAllLines(GuiManager.MyConfigManagerConfig.MachinesList); 
     foreach (string MFW in MFWs) 
     { 
      if (MFW != System.Environment.MachineName) 
      { 
      String target = @"\\" + MFW + @"\D\IbSi\config\" + Path.GetFileName(ConfigFile); 
      String backup = @"\\" + MFW + @"\D\IbSi\userdata\" + Path.GetFileName(ConfigFile); 
      try 
      { 
       File.Copy(source, target, true); 
       File.Copy(source, backup, true); 
      } 
      catch (Exception ex) 
      { 
       Manager.SendMessage("Failed to copy " + Path.GetFileName(ConfigFile) + " to " + MFW + "\n" + ex.Message); 
      } 
      } 
     } 
+3

あなたは常に、「利用可能かどうかを確認する要求があったときに利用可能になる可能性がありますが、実際に必要なときは利用できません。だからあなたの最善の策は、操作を試みることです。あなたができることはいくつかあります。ローカルコンピュータ上のDNSエントリが最新であることを確認してください。おそらくそれは時間の分解を短縮するでしょう。このスタックオーバーフロー問題はちょうどそれを扱うように見えます;スレッド(またはタスク)を使用して特定のタスク(ファイルコピーなど)を実行し、時間がかかりすぎる場合はタイムアウトします。http://stackoverflow.com/questions/1232953/speed-up-file-exists-for-non- existing-network-shares –

答えて

1

あなたは(this答えから取られた)コピーを開始する前に、コンピュータにpingを実行できます。

using System.Net.NetworkInformation; 

public static bool IsHostAvailable(string nameOrAddress) 
{ 
    bool pingable = false; 
    Ping pinger = new Ping(); 
    try 
    { 
     PingReply reply = pinger.Send(nameOrAddress); 
     pingable = reply.Status == IPStatus.Success; 
    } 
    catch (PingException) 
    { 
     // Discard PingExceptions and return false; 
    } 
    return pingable; 
} 

あなたはサーバー上のファイアウォールがピングのために開いていることを確認する必要があるコメントで述べたように(

+1

リモートコンピュータがpingをブロックするように設定されている場合、コンピュータが使用可能な場合でもこのルーチンは常にfalseを返します。 – sgmoore

関連する問題