У меня есть сеть, состоящая из нескольких компьютеров, для простоты возьмите два компьютера: 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 закончил писать его, а не во время написания?
@DarinDimitrov Почему [дубликат об общих замках] (http://stackoverflow.com/questions/1409492/read-from-a-growing-file-in-c) не ответил на этот вопрос? – CodeCaster
Потому что * повторяющийся вопрос * о единственной синхронизации процесса, которую можно тривиально решить с помощью ключевого слова 'lock'. Этот вопрос касается синхронизации между процессами и даже более того: межпроцессная синхронизация по сети, которая является гораздо более различной (и сложной) проблемой. Существует большая разница между многопоточной, многопроцессорной и мульти-машинной синхронизацией. –
@ Darin мой плохой, похоже, я использовал неправильный дубликат. Во всяком случае, есть много вопросов об этом, и соответствующие термины находятся в той, с которой я связан (общий замок для чтения). Во всяком случае, OP, пожалуйста, поделитесь своими исследованиями. – CodeCaster