2012-07-26 49 views
0

目前我正在编写windows服务来处理大量的xml文件并将xml文件中的信息保存到数据库。有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); 
} 
+1

只是为了排除明显...你得到,如果该服务上运行的只有一台机器未发现异常文件? – Teppic 2012-07-26 23:23:53

+0

如果服务在1台机器上运行,则没有例外,系统工作正常。这个问题是由于这两个机器捕获的文件和处理相同的时间相同的快照 – 2012-07-27 00:01:50

回答

0

请问您能解释目录中出现的文件名称?

  1. 如果文件的名称中已经有目标机器名,那么每台机器只处理那些命名文件(或不是??)就足够了。
  2. 如果文件没有指定任何特殊的机器名称,它看起来像是正在工作的服务中的一个种族,他们首先捕获文件。那么你的异常似乎是可以预期的(就像Eric J.所说的那样),你只需尝试......抓住它并省略文件。这是正常的,一些其他服务已经捕获该文件。或者你可以考虑一些资源共享技术,以避免几次服务一次检查目录。至少你可以做一些子目录,将所有文件分成几组,并使每个服务在每个子目录中工作...

PS:当然,如果你觉得,我没有发现问题,请提供一些更准确的信息。

1

很难看到发生了什么不看你的代码,但我会猜测,这三个单独的服务器得到一个目录列表,然后从列表文件的工作,并同时另一台服务器已重命名该文件,因为其他服务器决定开始处理该文件。

如果不经常发生这种情况,您可以忽略异常(假设我的解释是正确的)。如果这种情况经常发生,您需要更详细地解释您正在做的事情。

您可以通过让每个服务器以不同的方式对文件列表进行排序(例如,一个AZ,第二个ZA,第三个LZ,AJ,...),以最小化争用同一文件,然后选择顶部的要处理的排序顺序。

+0

代码是相当简单的我上面添加。 ChangeExtension简单地重命名文件以附加机器名称 – 2012-07-27 00:10:45

+1

正如@eric所述,您应该忽略异常并继续工作。我猜你会重命名文件以将其标记为“正在扫描”,因此让一台机器抓住它并让其他人跳过它的逻辑就好了。至少对我来说。 – 2012-07-29 00:05:13

0

正如埃里克·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); 
}