私は非常に似たようなことを書いています。私は、FileSystemWatcherを使用して変更に関する通知を取得しました。その後、FileStreamを使用してデータを読み込みました(ファイル内の最後の位置を追跡し、新しいデータを読み込む前にそれを探します)。次に、読み込まれたデータをバッファに追加して、完全な行を自動的に抽出し、UIに出力します。
注:「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);
}
}
}
}
}
なぜdownvote? – RichS