使用 .NET Core 2.0 监控 Windows 上的文件更改

Monitor changes in files on Windows using .NET Core 2.0

在你向我发送指向 here, here and maybe here 的链接之前,请耐心等待。

我想编写一个服务来监视给定文件集的更改,我从编写监视目录的控制台应用程序最简单的事情开始,以便继续我的 POC。但是,我在尝试提取所做的实际更改时遇到了困难。 (是的,我设法处理了 FileSystemWatcher class 中的事件,但据我所见 class 的 API 我无法跟踪实际更改)

你知道有没有办法做到这一点?也许没有那么多痛苦或不必要的手术。

我目前使用的是 .NET Core 2.0,但任何版本的 .NET Core 都可以。

编辑:我需要监控的文件是基于文本的,基本上我想实现 git diff 功能并报告更改。

简短的回答是否定的,没有 API 会告诉您文件的哪一部分被修改了。您可以从 OS 获得的只是一个文件发生更改的通知,而不是您从 FileSystemWatcher.

获得的更改的性质或位置。

要检测更改的性质,您需要能够比较更改前后的文件内容。在大多数情况下,您无权访问文件的先前状态。您可以使用卷影副本访问文件的先前状态,但这有其自身的问题。

如果您只监视少量文件,那么您可以进行某种指纹识别(例如块级散列)来检测更改的位置。您仍然需要前后对照才能检测到特定的变化。

也就是说...

原则上可以挂接到用于实际将数据写入磁盘的 Windows API。我没有在 .NET 上尝试过,但我过去曾使用 Detours 来做类似的事情。请注意,API 挂钩是一个危险的领域,如果你弄错了,你可能会毁了你的电脑。这里是龙。如果您想走这条路,我强烈建议您在编写代码时着眼于最大限度地减少延迟。