我有一个.csv文件,该文件经常更新(约20至30倍,每分钟)。我要插入新增加的线数据库,尽快为他们写入文件。

更改 类听到的文件系统的更改通知,并可以提高一个事件,只要有一个改变指定的文件。问题是,该更改不能确定这线是添加或删除(尽我知道)。

一种方法读取这些行的是保存和比较线数之间的变化和读取之间的差最后一次和第二最后的变化。然而,我要寻找一个清(也许更优雅)的解决方案。

有帮助吗?

解决方案

我写的东西非常相似。我用的更改得到有关通知的变化。然后我用一个文件流读数据(跟踪我的最后一位内的文件和寻求之前阅读的新的数据)。然后我加入读取数据以缓冲自动提取完整的线,然后输出,然后向用户界面。

注:"这一点。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 );
                        }
                    }
                }
            }
        }

其他提示

对,该更改不知道什么关于你的文件的内容。它会告诉你如果它变更,等等。但不是什么改变。

你只是添加到该文件?这是有点不清楚从后是否行已加入或可能也被删除。假设他们是所附的,解决方案是非常简单,否则你会做一些比较。

我觉得你应该使用NTFS变化的期刊或类似的:

变更日志是用来通过NTFS到 提供一个持久记录所有 作出的改变以上的文件量。每一卷,新技术文件系统使用的改变 杂志 追踪信息 添加、删除和修改的文件.变化的期刊得多 有效时间邮票或文件 通知确定的变化 在给定名称空间。

你可以找到一个 说明:.你将需要使用PInvoke。网。

我会保持目前的案文,在存储器如果这是足够小,然后使用的差异算法检查,如果该新的文本和先前文本的改变。这个图书馆, http://www.mathertel.de/Diff/, 不仅会告诉你东西改变了,但什么样的改变。所以你可以随后插入的发生改变的数据进入数据库。

关掉我的头顶,你可以储存的已知的最后文件的大小。检查对文件的尺寸,并且当它变化,开启一个读者。

然后寻求读者对你的最后文件的尺寸,并开始阅读。

你是对有关更改.你可以听于创建、修改、删除,等等。事件,但是你没有得到深刻得多的文件,该文件提出了他们。

你有没有控制权的文件本身?你可以改变的模式略微使用的文件,如一个缓冲区。代替一个文件,有两个。一个是临时的,一个是总所有已处理的输出。读取所有的线路从你的"缓冲区"的文件,处理它们,然后插入另一个文件,该文件是总的所有行处理。然后,删除线你处理。这样,所有信息,在你的文件是有待处理。美中不足的是,如果该系统的任何其他写(即也删除线),那么它不会的工作。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top