我有一组源文件夹。我使用Java类从这些文件夹中构建分发文件。我想在Java中编写另一个小类,每半秒运行一次,检查文件夹中的任何文件是否已更改,如果是,则运行构建类。
那么,如何轻松检测到文件夹已被修改?
答案 0 :(得分:4)
我认为您需要检查目录和子目录修改时间(对于要添加/删除的文件)和文件修改时间(对于每个文件中的更改)。
编写一个递归例程,检查目录是否有修改时间,是否已更改,以及每个文件。然后检查目录内容,并递归调用任何子目录。您应该能够检查比上次运行检查时更大的修改时间。
编辑:自从我写了上面的内容之后,Java 7就推出了directory watching capability。
答案 1 :(得分:3)
此处列出了possible solutions和简单File/Folder Watcher的示例。
答案 2 :(得分:2)
如果可以允许使用Java 7,则它支持与平台无关的目录/文件更改通知。
JNA有一个跨平台变更通知示例here。不确定你会发现它有多容易。
答案 3 :(得分:1)
我不知道这是否有用,但是here's一个人对这个问题有所了解。
听起来.NET内置了一些内容:FileSystemWatcher
更新:感谢kd304,我刚刚了解到Java 7将拥有same feature。除非你可以使用preview release。
,否则今天对你不会有好处答案 4 :(得分:1)
您需要观察每个文件并跟踪File.lastModified
属性并检查File.exists
标志以及一些简单的递归来遍历目录结构。< / p>
答案 5 :(得分:0)
使用NIO2(Java7)将非常容易。使用Java6,您可以调用list()并与之前的列表进行一次比较吗? (一个穷人看服务)
答案 6 :(得分:0)
是的,目录中有许多可用的侦听器,但它们都相对复杂,而且大部分涉及线程。
几天前,我与我们的一位工程师进行了几乎激烈的讨论,讨论是否允许创建新线程(在Web应用程序中)只是为了监视目录树。最后我和他达成了一致,但是由于提出了一些如此之快的事情,以至于不需要听众。注意:如果您不需要知道哪个文件已更改,只有 a 文件已更改,则下面介绍的解决方案才有效。
您使用文件集合提供以下方法(例如,通过Apache IO的FileUtils.listFiles()方法获得),这将返回集合的哈希值。如果添加,删除任何文件或更改其修改日期,则哈希值将更改。
在我的测试中,在3Ghz Linux机器上,50K文件大约需要750毫秒。触摸任何文件都会改变哈希值。在我自己的实现中,我使用的是另一种哈希算法(DJB),但速度要快一些,但这就是它的要点。我们现在只是存储哈希值,并且每次检查它都非常轻松,特别是对于较小的文件集合。如果有任何变化,我们会重新索引目录。在我们的应用程序中,观察者的复杂性并不值得。
/**
* Provided a directory and a file extension, returns
* a hash using the Adler hash algorithm.
*
* @param files the Collection of Files to hash.
* @return a hash of the Collection.
*/
public static long getHash( Collection<File> files )
{
Adler32 adler = new Adler32();
StringBuilder sb = new StringBuilder();
for ( File f : files ) {
String s = f.getParent()+'/'+f.getName()+':'+String.valueOf(f.lastModified());
adler.reset();
adler.update(s.getBytes());
sb.append(adler.getValue()+' ');
}
adler.reset();
adler.update(sb.toString().getBytes());
return adler.getValue();
}
是的,还有改进的余地(例如,我们使用哈希方法而不是内联方法)。以上内容是从我们的实际代码中删除的,但应该让您知道我们做了什么。