Есть ли способ прочитать активно записанный файл журнала без блокировки в .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

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