2012-07-26 110 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); 
}