0

現在、大量のxmlファイルを処理し、xmlファイルからデータベースに情報を保存するWindowsサービスを作成しています。同じ共有場所を指す同じサービスを実行している 3 台のマシンがあります。プロセス中にファイルが見つからないという例外が常に発生し、この問題を解決する方法がわかりません。ディレクトリからすべてのファイルを取得し、マシン名に基づいてそれらのファイルの名前を変更し、各マシンが独自のファイルセットを処理できるようにしましたが、依然として File Not Found 例外が発生します。誰かがこれに対処する適切な方法を教えてくれませんか。

ありがとうございました。

コード

if (Directory.Exists(folder))
{
  string pattern = ".xml";
  string machineName = System.Environment.MachineName;
  string[] files = Directory.GetFiles(folder, pattern, SearchOption.AllDirectories);  
  newExt = string.Format("{0}.{1}", machineName, newExt);
  for (int i = 0; i < files.Length; i++)
  {
      if (files[i].Contains(machineName))
      {
           //replace this new extension
           files[i].Replace(machineName + ".", "");
      }
      else
      {
           files[i] = ChangeExtension(files[i], newExt, true);
      }
  }
  IEnumerable<string> sortedFiles = files.Where(f => !string.IsNullOrEmpty(f) && f.Contains(machineName))
                                         .OrderBy(f => f, Sorter);
}
4

3 に答える 3

1

コードを見ずに何が起こっているのかを確認するのは難しいですが、3つの個別のサーバーがディレクトリリストを取得し、そのリストからファイルを選択して作業し、その間に別のサーバーがファイルの名前を変更したと推測します。もう一方のサーバーは、ファイルの処理を開始することを決定しました。

これがまれにしか発生しない場合は、例外を無視できます(私の説明が正しいと仮定します)。これが頻繁に発生する場合は、何をしているのかをより詳細に説明する必要があります。

各サーバーでファイルリストを異なる方法(たとえば、1つのAZ、2番目のZA、3番目のLZ、AJなど)で並べ替えてから、並べ替え順序で一番上のファイルを選択することで、同じファイルの競合を最小限に抑えることができます。作業します。

于 2012-07-26T23:19:06.073 に答える
0

ディレクトリに表示されるファイルの名前を教えてください。

  1. ファイルの名前にすでにターゲットマシン名が含まれている場合、各マシンはそれらの名前付きファイルのみを処理するだけで十分です(またはそうではありませんか??)。
  2. 特別なマシン名が指定されていないファイルが表示された場合、最初にファイルをキャプチャする作業サービス間の競合のように見えます。次に、例外は予想可能であるように思われ(Eric J.が言ったように)、それをキャッチしてファイルを省略してみてください。これは正常であり、他のサービスがすでにそのファイルをキャプチャしています。または、一度にディレクトリをチェックする複数のサービスを回避するために、いくつかのリソース共有手法を検討することもできます。少なくとも、いくつかのサブディレクトリを作成して、すべてのファイルをいくつかのグループに分割し、各サービスを各サブディレクトリで機能させることができます...

PS:確かに、私が問題を捉えられなかったと感じた場合は、もっと正確な情報を提供していただけませんか。

于 2012-07-27T00:49:58.327 に答える
0

Eric J が述べたように、エラーは単純に無視できます。

if (Directory.Exists(folder))
{
  string pattern = ".xml";
  string machineName = System.Environment.MachineName;
  string[] files = Directory.GetFiles(folder, pattern, SearchOption.AllDirectories);  
  newExt = string.Format("{0}.{1}", machineName, newExt);

  for (int i = 0; i < files.Length; i++)
  {
      try
      {
          if (files[i].Contains(machineName))
          {
               //replace this new extension
               files[i].Replace(machineName + ".", "");
          }
          else
          {
               files[i] = ChangeExtension(files[i], newExt, true);
          }
     catch(FileNotFoundException ex)
     {   
     } 
  }

  IEnumerable<string> sortedFiles = files.Where(f => !string.IsNullOrEmpty(f) && f.Contains(machineName))
                                         .OrderBy(f => f, Sorter);
}
于 2012-07-28T23:44:39.220 に答える