簡體   English   中英

並發讀取寫入文件

[英]Concurrency reading writing files

目前,我正在編寫Windows服務,以處理大量的xml文件並將信息從xml文件保存到數據庫。 有3台運行相同服務的計算機指向相同的共享位置。 在此過程中,我總是會遇到“找不到文件”的異常情況,並且不知道如何解決此問題。 我試圖從目錄中獲取所有文件,然后根據計算機名稱重命名這些文件,並允許每台計算機處理自己的文件集,但仍然遭受“找不到文件”異常的困擾。 誰能告訴我解決這個問題的正確方法。

謝謝。

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);
}

不查看代碼就很難看到正在發生的事情,但是我推測這三台單獨的服務器會得到一個目錄列表,從該列表中選擇一個文件進行處理,與此同時,另一台服務器已重命名該文件,因為另一台服務器決定開始處理該文件。

如果這種情況很少發生,則可以忽略該異常(假設我的解釋正確)。 如果這種情況經常發生,您將需要更詳細地說明自己在做什么。

通過讓每個服務器以不同的方式對文件列表進行排序(例如,一個AZ,第二個ZA,第三個LZ,AJ等),然后按排序順序選擇最上面的一個,可以最大程度地減少同一文件的爭用。從事於。

您能否解釋一下目錄中出現了哪些名稱文件?

  1. 如果文件名稱中已經有目標計算機名,則每台計算機僅處理那些命名文件就足夠了(或沒有?)。
  2. 如果文件顯示時未指定任何特殊的機器名,則看起來就像工作服務之間的競爭,誰先捕獲了文件。 然后,您的異常似乎是可以預期的(就像Eric J.所說的那樣),您只需嘗試..catch它並忽略文件。 這是正常的,並且其他一些服務已經捕獲了該文件。 或者,您可以考慮采用某種資源共享技術來避免使用多個服務一次檢查目錄。 至少您可以創建一些子目錄,以將所有文件划分為一些組,並使每個服務都可以與每個子目錄一起使用...

PS:當然,如果您覺得我未能解決問題,請提供一些更准確的信息。

如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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM