1

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

4

1 回答 1

1

这是file-lock projectGitHub 上的一个,可用于同步对共享资源的访问 - 在您的情况下是一个文件。因此,当一个进程Computer_B需要写入文件时,它会尝试获取锁,写入文件并释放锁。同时,进程Computer_A将被通知FileSystemWatcher当前正在写入文件并尝试获取锁。如果失败,它可以重试,直到成功或超时。当它成功获取锁时,它可以安全地读取文件的内容。

这种技术的优点是不依赖于某些操作系统特定的功能,如互斥锁或命名事件句柄。

于 2016-01-05T17:31:00.580 回答