轮询文件以进行更改?

时间:2012-10-18 01:21:15

标签: clojure

我希望轮询文件以进行更改(最后一次写入时)。当文件确实从以前的值改变时,我希望执行一些功能。形式的东西。

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

,其中

  1. file-str只是一个指定文件位置的字符串
  2. on-change-fxfile-str处的文件更改时应调用的函数。我们假设on-change-fx应该将File对象指向file-str作为参数。
  3. current-value文件的当前值,以毫秒为单位。您可以设置为0以保证此函数至少运行一次,或者设置为实际值以仅在实际检测到更改时运行此函数。
  4. 我希望这个功能以最清晰,最简洁的Clojurist方式实现。谢谢。

3 个答案:

答案 0 :(得分:5)

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

  1. 使用Java互操作和the Java 7 WatchService API

  2. 检查并学习existing idiomatic, concise code(在这种情况下由Stuart Sierra)做出类似于你想要的事情。请注意,它也使用Java Interop。

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

答案 1 :(得分:5)

如果您希望轮询目录或文件并对其采取行动,我认为watchtower非常适合查看。

Java 7有一个WatchService,它使用文件系统事件来对更改做出反应。在这种情况下,您根本不进行轮询,而是阻止将来的文件事件。我不认为Clojure中有任何项目可以利用它,尽管我花了一些时间用它写一个small library。它的来源is here

我并不认为我的图书馆已经完整,但它确实使用了Java 7服务,因此您可以在自己的项目中使用它来获取灵感。

答案 2 :(得分:1)

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

否则有许多替代方案(如hara文档中所述):

可以从以下内容中提取一些代码:

您也可以执行hara所做的事情并包裹java.nio.file.WatchService