Читать из растущего файла в C#?

dir печати (модуль)

16
задан Kevin Panko 17 June 2011 в 16:01
поделиться

3 ответа

Вы можете сделать это, но вам нужно тщательно отслеживать позиции чтения и записи файла, используя Stream.Seek и с соответствующей синхронизацией между потоками. Обычно вы используете EventWaitHandle или его подкласс для синхронизации данных, и вам также необходимо рассмотреть возможность синхронизации для доступа к самому объекту FileStream (возможно, через ] lock ).

Обновление: Отвечая на этот вопрос , я реализовал нечто подобное - ситуацию, когда файл загружался в фоновом режиме, а также загружался одновременно . Я использовал буферы памяти и опубликовал суть , в которой есть рабочий код. (Это'

6
ответ дан 30 November 2019 в 22:43
поделиться

Я решил эту проблему с помощью класса DirectoryWatcher / FilesystemWatcher, и когда он запускает нужный файл, вы открываете FileStream и читаете его до конца. И когда я закончил чтение, я сохраняю позицию читателя, поэтому в следующий раз, когда DirectoryWatcher / FilesystemWatcher сработает, я открываю поток и устанавливаю позицию, в которой я был в последний раз.

Вызов FileStream.length действительно очень медленно, у меня не было проблем с производительностью с моим решением (я читал "журнал" размером от 10 МБ до 50 иш).

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

4
ответ дан 30 November 2019 в 22:43
поделиться

Еще одна вещь, которая может быть полезна, - это Класс FileStream имеет свойство ReadTimeOut, которое определяется как:

Получает или задает значение в миллисекундах, которое определяет, как долго поток будет пытаться читать до истечения времени ожидания. (унаследовано от Stream)

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

Выполняются ли операции чтения и записи на одном и том же объекте? Если это так, вы можете написать свои собственные абстракции над файлом, а затем написать код взаимодействия между потоками, чтобы поток, выполняющий записи, и уведомлял поток, выполняющий чтение, когда это было сделано, чтобы поток, выполняющий чтение, знал, когда прекратить чтение когда он достигает EOF.

2
ответ дан 30 November 2019 в 22:43
поделиться