【问题标题】:Monitor changes in files on Windows using .NET Core 2.0使用 .NET Core 2.0 监控 Windows 上的文件更改
【发布时间】:2018-04-30 16:11:31
【问题描述】:

在向我发送hereherehere 的链接之前,请耐心等待。

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

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

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

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

【问题讨论】:

  • 您在说什么对文件的“更改”?这是二进制文件还是纯文本?将“teh”更改为“the”与将二进制文件中间的 001010 更改为 110101 不同。好吧,在最低级别不是,但您应该详细说明。
  • 好点,我只谈论基于文本的文件,所以任何更改都可以,稍后我可能想决定实施一种仅跟踪相关更改的方法,但这是我现在想要的另一个主题查看文件如何更改(就像 git diff 一样)
  • @zaitsman 请告诉我你没有读过这个问题,否则我会感到震惊。
  • 虽然有很多其他人让它工作,但我很惊讶你甚至没有先找到一个工作样本,并且一直说“卡住”或“震惊”。即使是微软制作的测试用例也应该对理解 API 本身很有帮助,github.com/dotnet/corefx/tree/master/src/…
  • AFAIK,API 不支持此功能。大多数平台不跟踪文件中的实际更改;他们只是报告文件已更改并且他们知道新内容。例如,在 Linux 上,这是建立在 inotify 之上的。这只会让你得到改变的文件(名称)。 .NET Core 无法提供与平台无关的方式来公开并非在所有平台上都存在的功能。要进行类似 git 的 diff,您可能必须使用某种版本控制系统。

标签: c# .net-core file-monitoring


【解决方案1】:

简短的回答是否定的,没有 API 可以告诉您文件的哪一部分被修改。您可以从操作系统获得的只是文件发生更改的通知,而不是您从FileSystemWatcher 获得的更改的性质或位置。

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

如果您只监控少量文件,那么您可以进行某种指纹识别(例如块级哈希)来检测更改的位置。您仍然需要一个 before 和 after 来检测特定的变化。

也就是说……

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

【讨论】:

    猜你喜欢
    • 2017-11-18
    • 2018-03-15
    • 1970-01-01
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    相关资源
    最近更新 更多