jNotify在新文件上的怪异行为



我正在尝试评估当前的一个需求,在该需求中,我需要截取给定目录及其子目录中的文件更改。适合我需求的两个工具是jpathwatch和jnotify。jpathwatch可以工作,但不支持递归目录监视。Jnotify似乎很好地解决了这一限制。

在评估jnotify时,我观察到了一个奇怪的行为。这在linux和windows中都是一致的。让我举个例子来解释一下。我有以下目录结构:


C:
|-->Temp |
| -->File |
| -->Dir |
| -->SubDir

jNotify被配置为监听C/Temp/File。现在,如果我把一个文件放在"Dir"或"SubDir"文件夹下,它会捕获新创建的事件。但是,同时引发三个文件修改事件。以下是在"SubDir"文件夹中添加新文件Extraction.log时的输出。


created C:/Temp/File/Dir/SubDir/Extraction.log
modified C:/Temp/File/Dir/SubDir/Extraction.log
modified C:/Temp/File/Dir/SubDir/Extraction.log
modified C:/Temp/File/Dir/SubDir/Extraction.log

正如您所看到的,文件修改有3个事件。应用程序没有任何方法来判断是修改还是创建新文件。因此,它将处理同一个文件四次。

我正在使用JNotify网站中显示的示例代码。


package com.test.io;
import net.contentobjects.jnotify.JNotify;
public class JNotifyTest {
/**
* @param args
*/
public static void main(String[] args) {
JNotifyTest jNotify = new JNotifyTest();
try {
jNotify.sample();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void sample() throws Exception {
// path to watch
String path = "C:\Temp\File\";
// watch mask, specify events you care about,
// or JNotify.FILE_ANY for all events.
int mask = JNotify.FILE_CREATED  | 
JNotify.FILE_DELETED  | 
JNotify.FILE_MODIFIED | 
JNotify.FILE_RENAMED;
// watch subtree?
boolean watchSubtree = true;
// add actual watch
int watchID = JNotify.addWatch(path, mask, watchSubtree, new Listener());
// sleep a little, the application will exit if you
// don't (watching is asynchronous), depending on your
// application, this may not be required
Thread.sleep(1000000);
// to remove watch the watch
boolean res = JNotify.removeWatch(watchID);
if (!res) {
// invalid watch ID specified.
}
}
class Listener implements JNotifyListener {
public void fileRenamed(int wd, String rootPath, String oldName,
String newName) {
System.out.println("renamed " + rootPath + oldName + " ->" + newName);
}
public void fileModified(int wd, String rootPath, String name) {
System.out.println("modified " + rootPath + name);
}
public void fileDeleted(int wd, String rootPath, String name) {
System.out.println("deleted " + rootPath + name);
}
public void fileCreated(int wd, String rootPath, String name) {
System.out.println("created " + rootPath + name);
}
}
}

不幸的是,我不能使用jdk 1.7,因为我们被困在1.6中。

我见过一些与jNotify相关的帖子,如果有人能提供指针或任何替代解决方案来满足这一需求,我将不胜感激。

感谢

这很可能不是jNotify的问题,而是因为操作系统处理文件创建的方式。我在Python中的pynofity库中也看到过类似的情况。您应该在应用程序代码中处理这一问题,比如将触发器处理延迟几秒钟,这样您就可以缓冲任何新事件(如果有的话),然后只处理某个类型的最新事件。

最新更新