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 特定功能,例如互斥锁或命名事件句柄。