2016-01-05 44 views
1

我有一個由多臺計算機組成的網絡,爲簡單起見,需要兩臺Computer_A和Computer_B。其中之一Computer_A位於一個帶有設置的文本文件中。 Computer_B上的一個進程應該向該文本文件寫入一些行。 Computer_A上的另一個進程應該監視文件是否發生更改,如果發生此類更改,請讀入這些行。這是非常重要的,Computer_A上的進程可以確保該文件已被完全寫入,並且不會讀取半成行的行。在多臺計算機上讀取/寫入文件多個進程

我所擁有的是:

- >有關Computer_B,這確實寫:

using (FileStream fileStream = new FileStream(@"file_on_computer_A", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read)) 
    { 
     using (StreamWriter WriteToFile = new System.IO.StreamWriter(fileStream)) 
     { 
     WriteToFile.WriteLine("setting one"); 
     WriteToFile.WriteLine("setting two"); 
     //... 
     } 
    } 

- > Computer_A,使用FileSystemWatcher監控更改文件

 FSW = new FileSystemWatcher(); 
     FSW.Path = @"local_directory_path"; 
     FSW.Filter = "PLSanDM.txt"; 
     FSW.Changed += new FileSystemEventHandler(PLSanDM); 
     FSW.EnableRaisingEvents = true; 

和至於事件FSW.Changed火災時的閱讀本身:

void PLSanDM(object sender, FileSystemEventArgs e) 
    { 
      using (FileStream fs = new FileStream(@"path_to_file", FileMode.Open, FileAccess.Read)) 
      { 
       using (ReadFromFile = new System.IO.StreamReader(fs)) 
       { 
        List<string> linesInFile = new List<string>(); 
        string line; 
        while ((line = ReadFromFile.ReadLine()) != null) 
        { 
         linesInFile.Add(line); 
        } 
        foreach (string s in linesInFile) 
        { 
         //do sth 
        } 
       } 
      } 
    } 

但是,這導致Exception指出該文件當前正在被另一個進程使用,並且無法打開。

我在做什麼錯誤導致了異常,什麼是正確的解決方案? 爲了確保Computer_A只能在Computer_B完成寫入後才能讀取文件,而不是在寫入過程中需要更改哪些內容?

+0

@DarinDimitrov爲什麼做了[重複共享鎖](http://stackoverflow.com/questions/1409492/read-from-a-growing-file-in-c)不回答這個問題? – CodeCaster

+1

因爲*重複問題*是關於單個進程同步的,可以用'lock'關鍵字來解決。這個問題是關於進程間同步的,甚至更多的是:跨越網絡的進程間同步,這是一個更加不同(和困難)的問題。多線程,多進程和多機器同步有很大的區別。 –

+0

@Darin我的壞,好像我用錯了副本。無論如何,關於這一點還有很多問題,並且相關術語在我鏈接到的一個(共享讀寫鎖定)中。無論如何,OP,請分享你的研究。 – CodeCaster

回答

1

這是GitHub上的file-lock project,它可以用來同步對共享資源(您的案例中的文件)的訪問。因此,當Computer_B上的進程需要寫入文件時,它將嘗試獲取鎖,寫入文件並釋放鎖。與此同時,Computer_A上的進程將被FileSystemWatcher通知該文件當前正在寫入並嘗試獲取鎖。如果失敗,它可以重試直到成功或超時。當它成功獲取鎖定時,它可以安全地讀取文件的內容。

該技術的優勢在於不依賴於某些操作系統特定的功能,例如Mutexes或命名的事件句柄。