Visual Studio 2017 не может открыть существующий файл

Чтобы постоянно отслеживать хвост файла, вам просто нужно запомнить длину файла раньше.

public static void MonitorTailOfFile(string filePath)
{
    var initialFileSize = new FileInfo(filePath).Length;
    var lastReadLength = initialFileSize - 1024;
    if (lastReadLength < 0) lastReadLength = 0;

    while (true)
    {
        try
        {
            var fileSize = new FileInfo(filePath).Length;
            if (fileSize > lastReadLength)
            {
                using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                {
                    fs.Seek(lastReadLength, SeekOrigin.Begin);
                    var buffer = new byte[1024];

                    while (true)
                    {
                        var bytesRead = fs.Read(buffer, 0, buffer.Length);
                        lastReadLength += bytesRead;

                        if (bytesRead == 0)
                            break;

                        var text = ASCIIEncoding.ASCII.GetString(buffer, 0, bytesRead);

                        Console.Write(text);
                    }
                }
            }
        }
        catch { }

        Thread.Sleep(1000);
    }
}

Мне пришлось использовать ASCIIEncoding, потому что этот код недостаточно умен, чтобы обслуживать для переменных длин символов UTF8 на границах буфера.

Примечание. Вы можете изменить часть Thread.Sleep на разные тайминги, а также вы можете связать ее с файловым и шаблоном блокировки - Monitor.Enter / Wait /Пульс. Для меня достаточно таймера и, самое большее, он проверяет длину файла каждую секунду, если файл не изменился.

2
задан flyx 18 March 2019 в 18:54
поделиться