6

这通常是我希望轮询文件以进行更改的模式(上次写入时)。当文件确实从其先前的值更改时,我希望执行一些功能。某种形式的东西。

(poll-for-changes file-str on-change-fx current-value)

在哪里

  1. file-str只是一个指定文件位置的字符串
  2. on-change-fxfile-str是文件 at更改时应调用的函数。让我们说on-change-fx应该将指向的 File 对象file-str作为参数。
  3. current-value文件的当前值,以毫秒为单位。您可以设置为 0 以保证此函数将至少运行一次,或者设置为实际值以仅在您实际检测到更改时运行此函数。

我希望以尽可能最清晰、最简洁、Clojurist 的方式实现这个功能。谢谢你。

4

3 回答 3

5

如果您要轮询一个目录或文件并对其采取行动,我认为watchtower这很不错。

Java 7 有一个 WatchService,它使用文件系统事件来响应更改。在这种情况下,您根本不进行轮询,而是阻止未来的文件事件。我认为 Clojure 中没有任何项目可以利用它,尽管我花了一些时间玩弄它来编写一个小型库。它的来源在这里

我并没有声称我的库是完整的,但它确实使用了 Java 7 服务,因此您可以在自己的项目中使用它来获得灵感。

于 2012-10-18T13:34:49.030 回答
5

您可以在这里使用两种方法:

  1. 使用 Java 互操作和Java 7 WatchServiceAPI

  2. 检查并从现有的惯用、简洁的代码(在本例中为 Stuart Sierra)中学习,这些代码可以执行您想要的操作。请注意,它还使用 Java 互操作。

我认为选项 #1 是您最好的选择,并且该功能的实现应该是直截了当的。您可能希望使用dotoand->->>宏来使代码更具可读性。

于 2012-10-18T02:11:54.270 回答
1

现在我可能会hara.io.watch先尝试。

否则有很多选择(如hara文档中所述):

并且可以从中提取一些代码:

您也可以执行hara并包装java.nio.file.WatchService

于 2016-03-17T13:39:30.987 回答