Вы хотите открыть FileStream
в двоичном режиме.Периодически ищите до конца файла минус 1024 байта (или что-то еще), затем читайте до конца и выводите.Вот как работает tail -f
.
Ответы на ваши вопросы:
Двоичный файл, потому что трудно получить произвольный доступ к файлу, если вы читаете его как текст.Вы должны сделать двоичное преобразование в текст самостоятельно, но это не сложно.(См. Ниже)
1024 байта, потому что это удобное удобное число, которое должно обрабатывать 10 или 15 строк текста.Обычно.
Вот пример открытия файла, чтения последних 1024 байт и преобразования его в текст:
static void ReadTail(string filename)
{
using (FileStream fs = File.Open(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
// Seek 1024 bytes from the end of the file
fs.Seek(-1024, SeekOrigin.End);
// read 1024 bytes
byte[] bytes = new byte[1024];
fs.Read(bytes, 0, 1024);
// Convert bytes to string
string s = Encoding.Default.GetString(bytes);
// or string s = Encoding.UTF8.GetString(bytes);
// and output to console
Console.WriteLine(s);
}
}
Обратите внимание, что вы должны открыть с помощью FileShare.ReadWrite
, так как вы 'мы пытаемся прочитать файл, который в данный момент открыт для записи другим процессом.
Также обратите внимание, что я использовал Encoding.Default
, что в США / английском и для большинства западноевропейских языков будет 8-битной кодировкой символов.Если файл записан в какой-либо другой кодировке (например, UTF-8 или другой кодировке Unicode), возможно, что байты не будут правильно преобразованы в символы.Вам придется справиться с этим, определив кодировку, если вы думаете, что это будет проблемой.Переполнение стека поиска для получения информации об определении кодировки текста файла.
Если вы хотите делать это периодически (например, каждые 15 секунд), вы можете настроить таймер, который вызывает метод ReadTail
так часто, как:ты хочешь.Вы можете немного оптимизировать ситуацию, открыв файл только один раз в начале программы.Это зависит от вас.