Java 7 Directory WatchService不检测新文件

时间:2013-01-21 10:35:02

标签: java watchservice

我已经实现了一个WatchService来监听Linux(Redhat6)文件系统上的单个文件夹。 当我将文件拖放到文件夹(通过WinSCP)时,将检测并处理该文件。但是,当FTP进程删除文件夹中的文件时。他们没有被接走?

这是线程代码

@Override
public void run() {

    log.info("Starting " + NAME);

    while (mustLive) {

        try {

            // get Event or wait for one
            WatchKey watchKey = watchService.take();
            // log.debug("Event found");

            // we are only interested in Create Events
            List<WatchEvent<?>> events = watchKey.pollEvents();

            for (WatchEvent<?> event : events) {

                // we need to get the Absolute Path, so more code is needed
                // to retrieve it.
                Path dir = (Path) watchKey.watchable();
                Path fullPath = dir.resolve((Path) event.context());

                if (event.kind() == StandardWatchEventKinds.ENTRY_CREATE) {

                    log.debug("Created: " + event.context().toString());
                    // callback to process the file
                    caller.processNotificationFile(fullPath, eps);
                }

                if (event.kind() == StandardWatchEventKinds.ENTRY_DELETE) {
                    // log.debug("Delete: " + event.context().toString());
                }
                if (event.kind() == StandardWatchEventKinds.ENTRY_MODIFY) {
                    // log.debug("Modify: " + event.context().toString());
                }
            }

            // reset the Watcher for new
            boolean resetOK = watchKey.reset();

            if (!resetOK) {
                log.debug("Reset NOK");
                continue;
            }
        } catch (InterruptedException e) {
            killThread();
        }

    }

}

当我删除并删除受监控文件夹中的相同文件(应该已被拾取)时,它会被检测到并被拾取(因此Watcher正在工作并启动并运行)。 所以在FTP拷贝期间的某个地方出了问题。现在唯一的区别是文件以root用户身份FTP到文件夹,但所有文件的READ访问权限都是ON。当我知道该文件时,我是另一个用户(拥有WatcherThread的同一个用户)。

这是问题吗,其他用户拥有的文件没有被提取?如果是这样,如何解决这个问题?

感谢您的帮助, 科恩

更新: 我用两个不同的非root用户尝试了SCP,然后检测并拾取了文件。 我试图在整个文件夹上设置一个umask 0000,没有效果。

0 个答案:

没有答案