首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WatchService文件覆盖通知

WatchService文件覆盖通知
EN

Stack Overflow用户
提问于 2018-04-18 04:28:38
回答 1查看 158关注 0票数 0

当文件夹中的文件被覆盖时,我想得到通知。例如:我在一个文件夹中有一个文件A.JSON。当我覆盖相同路径中的相同文件(A.JSON)时,我希望得到通知。

我已经尝试了WatchService样本,根据下面的链接。

https://kodejava.org/how-to-monitor-file-or-directory-changes/

代码语言:javascript
复制
    // I kept a file called A.JSON in this path
    Path path = FileSystems.getDefault().getPath("/Users/XYZ/MyProjectWorkspace/MyTestProject/src");

    try {
                    Boolean isFolder = (Boolean) Files.getAttribute(path,
                            "basic:isDirectory", NOFOLLOW_LINKS);
                    if (!isFolder) {
                        throw new IllegalArgumentException("Path: " + path + " is not a folder");
                    }
                } catch (IOException ioe) {
                    // Folder does not exists
                    ioe.printStackTrace();
                }


    System.out.println("Watching path: " + path);
                // We obtain the file system of the Path
                FileSystem fs = path.getFileSystem ();

                // We create the new WatchService using the new try() block
                try(WatchService service = fs.newWatchService()) {

                    // We register the path to the service
                    // We watch for creation events
                    path.register(service, ENTRY_CREATE, ENTRY_MODIFY, ENTRY_DELETE);


                    // Start the infinite polling loop
                    WatchKey key = null;
                    while(true) {
                        key = service.take();

                        // Dequeueing events
                        Kind<?> kind = null;
                        for(WatchEvent<?> watchEvent : key.pollEvents()) {

                            /*final Path changed = (Path) watchEvent.context();
                            System.out.println(changed);
                            if (changed.endsWith("A.json")) {
                                System.out.println("My file has changed");
                            }
                            */

                            // Get the type of the event
                            kind = watchEvent.kind();
                            if (OVERFLOW == kind) {
                                continue; //loop
                            } else if (ENTRY_CREATE == kind) {
                                // A new Path was created 
                                //Path newPath = ((WatchEvent<Path>) watchEvent).context();
                                // Output
                                //System.out.println("New path created: " + newPath);
                                System.out.println("New path created");
                            } else if (ENTRY_MODIFY == kind) {
                                // A new Path was created 
                                //Path newPath = ((WatchEvent<Path>) watchEvent).context();
                                // Output
                                //System.out.println("New path created: " + newPath);
                                System.out.println("Modified");
                            }
                        }

                        if(!key.reset()) {
                            break; //loop
                        }
                    }

                } catch(IOException ioe) {
                    ioe.printStackTrace();
                } catch(InterruptedException ie) {
                    ie.printStackTrace();
                }

当新文件夹被创建或修改等时,它可以工作。但是,当文件夹中的相同文件被覆盖时,我希望得到通知。

请告诉我如何解决这个问题?

EN

回答 1

Stack Overflow用户

发布于 2018-04-18 08:11:24

监视服务仅在该目录中查找更改。如果您在目录中创建了一个文件夹,系统将告知您该文件夹的创建过程。如果在该新文件夹中创建文件,系统可能会通知您关注的目录中的文件夹已被修改;您不会被告知关注的目录内的文件夹中添加、修改或删除的文件或文件夹。要做到这一点,您还需要监视这些子文件夹。

我将您的if语句替换为以下语句:

代码语言:javascript
复制
if (kind == ENTRY_CREATE || kind == ENTRY_MODIFY || kind == ENTRY_DELETE) {
    Path newPath = ((WatchEvent<Path>) watchEvent).context();
    System.out.println(kind + ": "+newPath+"  ");
}

然后我运行代码,在监视目录中创建、修改和删除一个"A.json“文件。然后,我在其中创建了一个“子文件夹”和“子文件夹”,在其中创建、修改和删除了"A.json“。我收到以下输出:

观看路径: /Users/aneufeld/workspaces/olan/StackOverflow/src/stackoverflow

ENTRY_CREATE: A.json

ENTRY_MODIFY: A.json

ENTRY_DELETE: A.json

ENTRY_CREATE:子文件夹

ENTRY_MODIFY:子文件夹

ENTRY_MODIFY:子文件夹

ENTRY_MODIFY:子文件夹

ENTRY_DELETE:子文件夹

如您所见,监视服务仅正确地报告监视目录中的创建、修改和删除。当文件夹内的条目被添加或移除时,监视目录中的文件夹可以被标记为已修改,但是没有提供关于修改是什么的指示。子子文件夹中的更改完全是静默的。

从起始路径监视所有子文件夹,而不是

代码语言:javascript
复制
path.register(service, ENTRY_CREATE, ENTRY_MODIFY, ENTRY_DELETE);

您可以使用:

代码语言:javascript
复制
Files.walkFileTree(path, new SimpleFileVisitor<Path>() {
    @Override
    public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
        dir.register(service, ENTRY_CREATE, ENTRY_MODIFY, ENTRY_DELETE);
        return FileVisitResult.CONTINUE;
    }
});

这将只注册已经存在的以path为根目录的文件夹。如果创建了一个新文件夹,您只会收到一个ENTRY_CREATE事件。您必须确定该条目是一个目录,并继续注册它。如果从监视服务中删除了ENTRY_DELETE事件和注销路径,则可能需要监视它们。让学生做练习。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49886940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档