gpt4 book ai didi

java - jNotify 对新文件的奇怪行为

转载 作者:行者123 更新时间:2023-12-01 05:05:18 25 4
gpt4 key购买 nike

我正在尝试评估当前的需求,我需要拦截给定目录及其子目录中的文件更改。适合我的要求的两个工具是 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 库中看到过类似的情况。您应该在应用程序代码中处理此问题,例如将触发器处理延迟几秒钟,以便可以缓冲任何新事件(如果有),然后仅处理某种类型的最新事件。

关于java - jNotify 对新文件的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12793062/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com