我有一个由多台计算机组成的网络,为简单起见需要两台,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 :(得分:1)
这里是GitHub上的file-lock project
,它可以用来同步对共享资源的访问 - 在你的案例中是一个文件。因此,当Computer_B
上的进程需要写入文件时,它将尝试获取锁,写入文件并释放锁。同时,Computer_A
上的进程将通知FileSystemWatcher
当前正在写入文件并尝试获取锁定。如果失败,它可以重试,直到成功或超时。当它成功获取锁定时,它可以安全地读取文件的内容。
此技术的优势在于不依赖于某些特定于操作系统的功能,如互斥锁或命名事件句柄。