在多台计算机上读/写文件多个进程

时间:2016-01-05 16:28:48

标签: c# stream filestream system.io.file

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

1 个答案:

答案 0 :(得分:1)

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

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