确定文件中更改的字节的开始和结束范围

时间:2009-03-10 21:17:21

标签: c# diff postgresql pervasive btrieve

我正在研究一个小型实验性工具,在我们公司内部使用,它可以对存储在我们的自定义CRM软件中的注释进行索引,以进行全文搜索。这些注释存储在Btrieve数据库(名为NOTES.DAT的文件)中。可以使用Pervasive的ADO.NET提供程序连接到数据库并检索用于索引的注释。但是,索引器当前循环遍历每个注释并每5分钟重新编制索引。这似乎非常低效。

不幸的是,我们的CRM软件没有办法向索引服务发出信号已经改变的信号,因为数据库可能存在于远程机器上(并且开发人员不会编写程序到通过网络与我的服务沟通,因为它现在只是一个爱好项目。)

我不想放弃,而是借此机会学习更多关于原始Btrieve数据库的知识。所以,这是我的计划......

必须共享NOTES.DAT文件,因为我们的CRM软件使用Btrieve API而不是ODBC驱动程序(这意味着客户端安装必须能够在网络上查看文件本身)。我想监视这个文件(使用类似FileSystemWatcher?),然后确定更改的字节。使用该信息,我将尝试计算该位置的记录并获取其主键。然后索引器将使用Pervasive的ADO.NET提供程序仅更新该记录。

问题(除了我还不太了解Btrieve文件的结构或者是否可以从原始数据中确定主键的事实)是我不知道如何确定开始和结束范围在NOTES.DAT中更改的字节数。

我可以区分两个版本,但这意味着在某处存储NOTES.DAT的副本(并且它可能非常大,因此是全文索引服务的原因)。

最有效的方法是什么?

谢谢!

编辑:在一个事务中可以添加,编辑或删除多个注释,因此如果可能,该方法需要能够确定多个单独的字节范围。

1 个答案:

答案 0 :(得分:1)

如果您的NOTES.DAT文件存储在NTFS partition上,那么您应该可以执行以下操作之一:

  • 使用USN journal标识changes到您的文件(首选)
  • 使用volume shadow copy service通过VSS(非常快)拍摄定期快照来跟踪文件的更改,然后执行以下任一操作:
    • diff版本NN-1(可能没有重新索引那么慢,但仍然很慢)或
    • 深入研究并尝试diff $Mft来确定哪些块在感兴趣的文件的哪些偏移处发生了变化(更复杂,但也更快 - 但仍然没有使用USN期刊快速,可靠和简单)

使用USN期刊应该是您的首选方法。您可以使用FSUTIL实用程序创建和截断USN日志。