gpt4 book ai didi

.net - 使用 .NET 实时读取文件中的更改

转载 作者:行者123 更新时间:2023-12-01 05:03:22 27 4
gpt4 key购买 nike

我有一个经常更新的 .csv 文件(大约每分钟 20 到 30 次)。我想在将新添加的行写入文件后立即将它们插入到数据库中。

FileSystemWatcher类监听文件系统更改通知,并且可以在指定文件发生更改时引发事件。问题是 FileSystemWatcher 无法准确确定添加或删除了哪些行(据我所知)。

读取这些行的一种方法是保存并比较更改之间的行数,并读取最后一次更改和倒数第二次更改之间的差异。但是,我正在寻找一种更简洁(也许更优雅)的解决方案。

最佳答案

我写过一些非常相似的东西。我使用 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 );
}
}
}
}
}

关于.net - 使用 .NET 实时读取文件中的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/86534/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com