【问题标题】:Monitor filesystem access on critical systems监控关键系统上的文件系统访问
【发布时间】:2014-05-19 16:29:49
【问题描述】:

我正在尝试使用 Java WatchEvent ENTRY_MODIFY 来检查文件是否正在被访问(即:读取、复制到剪贴板)。但是,从我制作的文档和一个小测试用例来看,该事件没有被触发。它仅在文件更改时触发。

我做错了吗?如果是这样,我如何监控文件系统上的文件?

【问题讨论】:

标签: java filesystems monitoring


【解决方案1】:

这不是直接内置在 java 中的。您最好的选择是跳入原生操作系统解决方案。但是,如果您想支持多个系统,这可能会很乏味。

如果您可以摆脱支持窗口,请查看THIS LINK。向下滚动到底部并查看类似的应用程序。您会对任何包含命令行界面的应用程序感兴趣。您需要做的是安装其中一个软件,然后使用 Runtime.exec 启动一个进程。您可能只使用直接 dll,但我没有资格告诉您哪个 dll 将为您提供该信息,或者它是否存在。如果您不想要第三方依赖,这可能是您想要研究的东西。

您将读取与 windows dll 挂钩的进程的结果,并告诉您文件当前是否打开 (See this link for more details)。您的应用程序必须提取数据(始终询问应用程序文件是否打开)。这并不理想,但可能是一个潜在的解决方案。

【讨论】:

  • 这是朝着正确方向迈出的一步。然而,这不是掉以轻心的事情。
【解决方案2】:

根据您对正在访问(复制和读取)文件的定义进行回答,但是对于文件更改,有几个现有的 API 可用。 Here 是监视文件更改的示例。

要检查文件是否复制到剪贴板,您可以使用Clipboard#hasFiles() 方法when content of clipboard modified。如果它返回true,则文件被复制到剪贴板。

要检查当前是否正在读取文件,您可以使用FileLock抽象类的实现来检查文件是否被锁定。它有acquiredBy() 方法返回当前持有文件锁的通道。

【讨论】:

  • 对不起,我对被阅读的定义是字面意思。想象一个 XML 文件在记事本上打开并被用户逐字阅读。这种情况没有可以依赖的锁。
  • 至于剪贴板,我们可以在shell上使用简单的复制命令来复制文件。没有剪贴板乱七八糟地做一个 hasFiles()。
【解决方案3】:

您可以尝试其他库来完成该任务,例如 http://jnotify.sourceforge.net/http://java.dzone.com/announcements/new-java-library-monitor-file 后者具体代表:文件访问监控 - 当访问或修改日期更改时,您将能够收到有关事件的通知。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-14
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    相关资源
    最近更新 更多