当文件夹中的文件被覆盖时,我想得到通知。例如:我在一个文件夹中有一个文件A.JSON。当我覆盖相同路径中的相同文件(A.JSON)时,我希望得到通知。
我已经尝试了WatchService样本,根据下面的链接。
https://kodejava.org/how-to-monitor-file-or-directory-changes/
// 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();
}当新文件夹被创建或修改等时,它可以工作。但是,当文件夹中的相同文件被覆盖时,我希望得到通知。
请告诉我如何解决这个问题?
发布于 2018-04-18 08:11:24
监视服务仅在该目录中查找更改。如果您在目录中创建了一个文件夹,系统将告知您该文件夹的创建过程。如果在该新文件夹中创建文件,系统可能会通知您关注的目录中的文件夹已被修改;您不会被告知关注的目录内的文件夹中添加、修改或删除的文件或文件夹。要做到这一点,您还需要监视这些子文件夹。
我将您的if语句替换为以下语句:
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:子文件夹
如您所见,监视服务仅正确地报告监视目录中的创建、修改和删除。当文件夹内的条目被添加或移除时,监视目录中的文件夹可以被标记为已修改,但是没有提供关于修改是什么的指示。子子文件夹中的更改完全是静默的。
从起始路径监视所有子文件夹,而不是
path.register(service, ENTRY_CREATE, ENTRY_MODIFY, ENTRY_DELETE);您可以使用:
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事件和注销路径,则可能需要监视它们。让学生做练习。
https://stackoverflow.com/questions/49886940
复制相似问题