我有一個由多臺計算機組成的網絡,爲簡單起見,需要兩臺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完成寫入後才能讀取文件,而不是在寫入過程中需要更改哪些內容?
@DarinDimitrov爲什麼做了[重複共享鎖](http://stackoverflow.com/questions/1409492/read-from-a-growing-file-in-c)不回答這個問題? – CodeCaster
因爲*重複問題*是關於單個進程同步的,可以用'lock'關鍵字來解決。這個問題是關於進程間同步的,甚至更多的是:跨越網絡的進程間同步,這是一個更加不同(和困難)的問題。多線程,多進程和多機器同步有很大的區別。 –
@Darin我的壞,好像我用錯了副本。無論如何,關於這一點還有很多問題,並且相關術語在我鏈接到的一個(共享讀寫鎖定)中。無論如何,OP,請分享你的研究。 – CodeCaster