2016-01-05 9 views
1

У меня есть сеть, состоящая из нескольких компьютеров, для простоты возьмите два компьютера: Computer_A и Computer_B. На одном из них, Computer_A, находится текстовый файл с настройками. Один процесс на Computer_B должен записать некоторые строки в этот текстовый файл. Другой процесс на 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

@DarinDimitrov Почему [дубликат об общих замках] (http://stackoverflow.com/questions/1409492/read-from-a-growing-file-in-c) не ответил на этот вопрос? – CodeCaster

+1

Потому что * повторяющийся вопрос * о единственной синхронизации процесса, которую можно тривиально решить с помощью ключевого слова 'lock'. Этот вопрос касается синхронизации между процессами и даже более того: межпроцессная синхронизация по сети, которая является гораздо более различной (и сложной) проблемой. Существует большая разница между многопоточной, многопроцессорной и мульти-машинной синхронизацией. –

+0

@ Darin мой плохой, похоже, я использовал неправильный дубликат. Во всяком случае, есть много вопросов об этом, и соответствующие термины находятся в той, с которой я связан (общий замок для чтения). Во всяком случае, OP, пожалуйста, поделитесь своими исследованиями. – CodeCaster

ответ

1

В GitHub есть file-lock project, который может использоваться для синхронизации доступа к общему ресурсу - файла в вашем случае. Поэтому, когда процесс на Computer_B должен записать в файл, он попытается получить блокировку, записать в файл и освободить блокировку. В то же время процесс Computer_A будет уведомлен FileSystemWatcher о том, что файл в настоящее время записывается и пытается получить блокировку. Если это не удается, он может повторить попытку до тех пор, пока это не удастся или не закончится. Когда ему удастся получить блокировку, он может спокойно прочитать содержимое файла.

Этот метод имеет то преимущество, что он не зависит от некоторых специфических функций ОС, таких как Мьютекс или названные дескрипторы событий.