2013-09-09 2 views
1

Я использую C#. Чтобы проиллюстрировать мою проблему, я упростил ее до 2 таймеров в приложении WinForms Desktop.Чтение файла при добавлении к другому потоку

Первый таймер случайным образом выбирает существующий текстовый файл, открывает его для добавления и записи строки до конца. Затем он закрыт.
Этот процесс вызывается повторно каждые несколько миллисекунд (или так).

Другой таймер также будет произвольно выбирать файл и пытаться его прочитать. Этот процесс также вызывается несколько раз в миллисекундах.

В конце концов, тот же файл адресуется обоими таймерами, и я получаю ошибку блокировки.

Теперь я дописать в файл, используя следующие строки кода:

 using (FileStream stream = new FileStream(_folder + "\\manifest.log", FileMode.Append, FileAccess.Write, FileShare.ReadWrite)) 
     { 
      TextWriter newWriter = new StreamWriter(stream); 
      newWriter.WriteLine(_timestamp); 
      newWriter.Flush(); 
      newWriter.Close(); 
     } 

и я прочитал файл, используя следующие строки кода:

 using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite, 0x1000, FileOptions.SequentialScan)) 
     using (var sr = new StreamReader(fs, Encoding.UTF8)) 
     { 
      string line; 
      while ((line = sr.ReadLine()) != null) 
      { 
       yield return line; 
      } 
     } 

Проблема с общим доступом является то, что не работает, если я использую 'Append'.
Проблема с блокировкой файла заключается в том, что у меня не будет возможности узнать перед собой, какой файл будет заблокирован, поскольку они выбраны случайным образом.

Прежде чем я посмотрю на изменение своего кода для этого, я подумал, что увижу, есть ли у кого-нибудь умная идея о том, как это решить.

благодаря

ответ

1

В коде писателя, открыт с FileShare.Read, и ваш читатель может с помощью FileShare.ReadWrite должно хватить.

Вы пробовали упростить свой тест. Просто создайте 2 экземпляра ваших Filestreams. 1 Выполняя запись, а затем сохраняя файл открытым, создайте второй файл, который выполняет чтение в том же файле. Затем вы можете проверить правильность обмена.

+0

Доброе утро, я должен проверить свой код перед публикацией! У меня есть FileShare.Read, установленный в FileShare.Write. -Какой ублюдок я! –

+0

не бейте себя, вы задали законный вопрос –

Смежные вопросы