Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 确定文件中更改的字节的开始和结束范围_C#_Diff_Postgresql_Pervasive_Btrieve - Fatal编程技术网

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

C# 确定文件中更改的字节的开始和结束范围,c#,diff,postgresql,pervasive,btrieve,C#,Diff,Postgresql,Pervasive,Btrieve,我正在开发一个小型实验性实用程序,在我们公司内部使用,它为存储在定制CRM软件中的注释编制索引,用于全文搜索。这些注释存储在Btrieve数据库(一个名为notes.DAT的文件)中。可以连接到数据库并检索注释,以便使用普适的ADO.NET提供程序编制索引。但是,索引器当前循环遍历每个注释,并每5分钟对其重新编制索引。这似乎效率极低 不幸的是,我们的CRM软件无法向索引服务发出通知,说明已更改,因为数据库可能存在于远程计算机上(而且开发人员不会编写通过网络与我的服务通信的过程,因为这只是一个爱好

我正在开发一个小型实验性实用程序,在我们公司内部使用,它为存储在定制CRM软件中的注释编制索引,用于全文搜索。这些注释存储在Btrieve数据库(一个名为notes.DAT的文件)中。可以连接到数据库并检索注释,以便使用普适的ADO.NET提供程序编制索引。但是,索引器当前循环遍历每个注释,并每5分钟对其重新编制索引。这似乎效率极低

不幸的是,我们的CRM软件无法向索引服务发出通知,说明已更改,因为数据库可能存在于远程计算机上(而且开发人员不会编写通过网络与我的服务通信的过程,因为这只是一个爱好项目)

与其放弃,我想借此机会进一步了解一下原始Btrieve数据库。所以,这是我的计划

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

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

我可以区分两个版本,但这意味着将NOTES.DAT的副本存储在某个地方(它可能非常大,因此需要全文索引服务)

最有效的方法是什么

谢谢


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

如果您的
NOTES.DAT
文件存储在上,则您应该能够执行以下操作之一:

  • 使用来标识您的文件(首选)
  • 使用通过VSS(非常快)定期拍摄快照来跟踪对文件的更改,然后:
    • diff
      ing版本
      N
      N-1
      (可能没有重新编制索引那么慢,但仍然很慢),或
    • 深入研究并尝试执行
      diff
      $Mft
      ,以确定感兴趣的文件在哪个偏移处更改了哪些块(要复杂得多,但也要快得多-但仍然不如使用USN日志那么快、可靠和简单)

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

Hahaha,注释消失的奇怪案例。=)无论如何,我不是一个Windows的人,但从我所看到的,FileSystemWatcher不会帮助你。您可能需要使用较低级别的API.Correct。我想FileSystemWatcher不会告诉我哪些字节已更改,但我希望它至少能在文件更改时通知我。我只需要知道在接到通知后该怎么办。希望Windows专家(Skeet?)能帮助您。OTOH,如果将文件保存在Linux机器上(可能通过SAMBA共享)是一种选择,inotify可能会做到这一点。