我有一个由多台计算机组成的网络,为简单起见,取两台计算机,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 完成写入后而不是在写入期间读取文件,我需要进行哪些更改?