代码之家  ›  专栏  ›  技术社区  ›  RobertFrank Picarus

监视类似于系统内部/Microsoft的filemon/process monitor的文件

  •  5
  • RobertFrank Picarus  · 技术社区  · 16 年前

    当一个文件被另一个应用程序关闭时,我需要生成一个事件。

    不幸的是,readdirectorychangesw没有报告关闭事件。我可以轮询(使用TTimer)readdirectorychangesw报告为已修改的任何文件,等待其关闭(使用createfile检测该文件)。

    但是,我更喜欢完全由事件驱动的解决方案。

    是否有方法挂接系统调用并检测所有文件关闭事件?我只想知道刚刚关闭的任何文件的路径和名称。

    5 回复  |  直到 7 年前
        1
  •  7
  •   kludg    16 年前

    只有Delphi没有一个很好的简单的解决方案-真正的解决方案是写一个 filter driver 监视文件关闭事件。

        2
  •  5
  •   Vegar    16 年前

    你应该看看马蒂亚斯·劳恩斯 madCodeHook :

    Madcodehook提供您所需的一切 在所有32个 和64位Windows操作系统 从Windows 95到Windows 7。你可以 选择是否要挂接API 在你自己的过程中,或在特定的 目标进程或系统范围。

        3
  •  2
  •   Mick    16 年前

    如果您选择进入过滤器驱动程序路径,eldos有callbackfilter组件:

    http://www.eldos.com/cbflt/spec.php

        4
  •  0
  •   Ritsaert Hornstra    16 年前

    如果更改通知不起作用,您可能会使用一种非常粗糙和蹩脚的方法:轮询。每隔一秒左右,尝试用一些不兼容的共享选项打开文件。一旦成功,您就知道另一个应用程序已经关闭了它。

    目前还不是最干净的选择,但它会起作用。如果您需要监控有限数量的文件,并且事先知道它们的名称,那么这只是一个选项。

        5
  •  -1
  •   TridenT    16 年前

    里面 绝地代码库(JCL) ,您有一个名为“tjvchangenotify”的组件,可以在其中获取通知。 当在受监视的目录中检测到更改时 :

    • 更改了“上次写入” =>所以这似乎正是您想要做的事情!

    它可以做的其他事情:

    • 更改了文件大小
    • 更改的文件名 …

    最重要的是,如果你想的话,它会在一个有子目录的文件夹中搜索。 以下是指向此组件的(部分)帮助文件的链接: http://help.delphi-jedi.org/item.php?Id=172982

    希望这会有所帮助。