Есть ли способ прочитать активно записанный файл журнала без блокировки в .NET?C#

Место общения программистов C#
Ответить
Anonymous
 Есть ли способ прочитать активно записанный файл журнала без блокировки в .NET?

Сообщение Anonymous »

У меня есть код C#, который пытается использовать строки из файла по мере его добавления. Файл периодически ротируется, поэтому важно, чтобы я мог «сдаться», а не зависать, если файл больше не будет обновляться.
Мой код примерно выглядит так :

Код: Выделить всё

while (true)
{
var path = LocateFile(); // scans the expected location for new files
using StreamReader reader = new(new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
StringBuilder line = new();
DateTime? noCharsFoundSince = DateTime.UtcNow;
while (true)
{
var readResult = reader.Read();
if (readResult > 0)
{
noCharsFoundSince = null;
var @char = (char)readResult;
if (@char == '\n')
{
ProcessLine(line.ToString());
line.Clear();
}
else
{
line.Append(@char);
}
}
else
{
if (noCharsFoundSince is null) { noCharsFoundSince = DateTime.UtcNow; }
else if (DateTime.UtcNow - noCharsFoundSince.Value > MaxIdleTime) { break; }
Thread.Sleep(1000);
}
}
}
Этот код работает почти идеально, но иногда кажется, что он зависает. Мне интересно, может ли StreamReader.Read() блокироваться на неопределенный срок в некоторых сценариях? Если да, то есть ли способ гарантировать, что Read() не зависнет, например, проверивstream.Length >stream.Position перед чтением?
Я запускаю .NET 8 в Linux.

Подробнее здесь: https://stackoverflow.com/questions/789 ... king-in-ne
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»