首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >并发读写文件

并发读写文件
EN

Stack Overflow用户
提问于 2012-07-27 07:13:12
回答 3查看 284关注 0票数 0

目前,我正在编写windows服务来处理大量的xml文件,并将信息从xml文件保存到数据库。有3台计算机运行相同的服务,指向相同的共享位置。我总是得到异常,文件在过程中找不到,不知道如何解决这个问题。我尝试从目录中获取所有文件,并根据机器名称重命名这些文件,并允许每台机器处理自己的一组文件,但仍然遇到未找到文件的异常。谁能告诉我处理这件事的正确方法。

谢谢。

代码

代码语言:javascript
复制
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);
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-27 08:49:58

您能解释一下目录中的文件是以什么名称出现的吗?

  1. 如果文件名中已有目标计算机名,则每台计算机只处理那些已命名的文件(或不处理??)就足够了。
  2. 如果文件出现时没有指定任何特殊的计算机名,则看起来就像是工作服务之间的竞赛,谁先捕获文件。那么您的异常似乎是可以预期的(就像Eric J.所说的那样),并且您只需try..catch它并省略该文件。这是正常的,并且某些其他服务已经捕获了该文件。或者,您可以考虑一些资源共享技术,以避免多个服务一次检查目录。至少您可以创建一些子目录,将所有文件分成一些组,并使每个服务与每个subdirectory...

一起工作

附言:当然,如果你觉得我没有抓住这个问题,你能提供一些更准确的信息吗?

票数 0
EN

Stack Overflow用户

发布于 2012-07-27 07:19:06

如果不查看您的代码,很难看出发生了什么,但我将推测这三个单独的服务器获得一个目录列表,从该列表中选择一个要处理的文件,同时另一台服务器已重命名该文件,因为另一台服务器决定开始处理该文件。

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

您可以通过让每个服务器以不同的方式对文件列表排序(例如,一个A-Z,第二个Z-A,第三个L-Z,A-J,...)来最小化对同一文件的争用。然后在排序顺序中选择最上面的一个来处理。

票数 1
EN

Stack Overflow用户

发布于 2012-07-29 07:44:39

正如Eric J所提到的,您可以简单地忽略这些错误:

代码语言:javascript
复制
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);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11679365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档