Read/Write 文件在多台计算机上的多个进程
Read/Write file multiple processes on multiple computers
我有一个由多台计算机组成的网络,为简单起见,取两台,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 完成写入后而不是在写入期间读取文件?
这是 GitHub 上的 file-lock project
,可用于同步对共享资源的访问 - 在您的案例中是一个文件。因此,当 Computer_B
上的进程需要写入文件时,它将尝试获取锁,写入文件并释放锁。同时,Computer_A
上的进程将被 FileSystemWatcher
通知当前正在写入文件并尝试获取锁。如果失败,它可以重试,直到成功或超时。当它成功获得锁后,它可以安全地读取文件的内容。
此技术的优点是不依赖于某些 OS 特定功能,例如互斥锁或命名事件句柄。
我有一个由多台计算机组成的网络,为简单起见,取两台,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 完成写入后而不是在写入期间读取文件?
这是 GitHub 上的 file-lock project
,可用于同步对共享资源的访问 - 在您的案例中是一个文件。因此,当 Computer_B
上的进程需要写入文件时,它将尝试获取锁,写入文件并释放锁。同时,Computer_A
上的进程将被 FileSystemWatcher
通知当前正在写入文件并尝试获取锁。如果失败,它可以重试,直到成功或超时。当它成功获得锁后,它可以安全地读取文件的内容。
此技术的优点是不依赖于某些 OS 特定功能,例如互斥锁或命名事件句柄。