Я написал нечто очень похожее. Я использовал FileSystemWatcher для получения уведомлений об изменениях. Затем я использовал FileStream для чтения данных (отслеживая мою последнюю позицию в файле и просматривая ее перед чтением новых данных). Затем я добавляю прочитанные данные в буфер, который автоматически извлекает полные строки, а затем выводит их в пользовательский интерфейс.
Примечание: "this.MoreData (..) - это событие, прослушиватель которого добавляет в вышеупомянутый буфер и обрабатывает извлечение полной строки.
Примечание. Как уже упоминалось, это будет работать только в том случае, если изменения всегда являются дополнениями к файлу. Любые удаления вызовут проблемы.
Надеюсь, это поможет.
public void File_Changed( object source, FileSystemEventArgs e )
{
lock ( this )
{
if ( !this.bPaused )
{
bool bMoreData = false;
// Read from current seek position to end of file
byte[] bytesRead = new byte[this.iMaxBytes];
FileStream fs = new FileStream( this.strFilename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite );
if ( 0 == this.iPreviousSeekPos )
{
if ( this.bReadFromStart )
{
if ( null != this.BeginReadStart )
{
this.BeginReadStart( null, null );
}
this.bReadingFromStart = true;
}
else
{
if ( fs.Length > this.iMaxBytes )
{
this.iPreviousSeekPos = fs.Length - this.iMaxBytes;
}
}
}
this.iPreviousSeekPos = (int)fs.Seek( this.iPreviousSeekPos, SeekOrigin.Begin );
int iNumBytes = fs.Read( bytesRead, 0, this.iMaxBytes );
this.iPreviousSeekPos += iNumBytes;
// If we haven't read all the data, then raise another event
if ( this.iPreviousSeekPos < fs.Length )
{
bMoreData = true;
}
fs.Close();
string strData = this.encoding.GetString( bytesRead );
this.MoreData( this, strData );
if ( bMoreData )
{
File_Changed( null, null );
}
else
{
if ( this.bReadingFromStart )
{
this.bReadingFromStart = false;
if ( null != this.EndReadStart )
{
this.EndReadStart( null, null );
}
}
}
}
}