【问题标题】:C# Monitor File ActivityC# 监控文件活动
【发布时间】:2019-01-13 17:05:32
【问题描述】:

我需要监控文件的更改并准确查看它的修改位置。

似乎我不能使用 FileSystemWatcher,因为我只收到文件已被修改的通知,但我无法确切知道发生了什么变化,并且在引发事件后存储文件的副本以进行差异不是可行,因为文件很大。

我想在他们的 Process Monitor 软件上实现类似 SysInternals 的东西,它告诉我们,对于 WriteFile 事件,文件的修改部分给定了偏移量和长度。

我读到有一个 Windows API 可以执行此操作,但我找不到任何关于如何或从何处开始在 .net 3.5 应用程序上实现它的任何信息。

【问题讨论】:

    标签: c# .net .net-3.5 filesystemwatcher file-monitoring


    【解决方案1】:

    根据我的调查,.NET 平台提供了这个event 用于处理文件更改事件。但是,仅此一项不会让您知道文件的哪一部分发生了更改。

    您需要在某处存储文件的副本,以便在文件更改时与文件进行比较,然后在比较完成时更新该副本。这是一个非常基本的解决方案,如果文件太大,效率会非常低。

    【讨论】:

    • 谢谢,是的,我知道 FileSystemWatcher,我正在使用它。关于更改本身,因为我只在固定大小的块中寻找非常特定的字节,所以我最终预加载了一个 Dictionary ,它为我提供了文件的第一个快照,然后我在 OnChange 事件中获得了另一个字典,让我有可能只对两者进行简单的差异并采取行动。
    【解决方案2】:

    使用 FileSystemWatcher 您可以订阅更改的事件ChangedEvent

    FileSystemEventArgs 包含一个属性 FullPath,它可以传递给FileInfo。这将为您提供一些基本文件信息,例如可以将其存储到数据库中。您可以通过这种方式保存文件更改的历史记录。

    如果您需要比较文件的内容,则更具挑战性,并且方法会因文件类型而异。

    【讨论】:

    • 是的,理想情况下,我希望 FileSystemWatcher 中的 onChanged 事件为我提供 FileWrite 事件的偏移量和长度,我相信这是在 SetFilePointer 函数上设置的。但为了实现这一点,这将是一个很大的痛苦,我想我将不得不处理一些开销。
    • 是否有您需要解决的特定用例?有一些可用于 .net 的差异工具,例如nuget.org/packages/Diff.Match.Patch 可能对你有用。
    • 我正在检查二进制文件中特定字节的差异,我认为这样的文本差异工具会增加不必要的复杂性。还是不知道,望研究一下,谢谢。
    猜你喜欢
    • 1970-01-01
    • 2020-05-30
    • 2019-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多