package com.***.cs.structs.esb;
import Common.MailService;
import java.io.File;
import java.io.IOException;
import java.nio.file.*;
import java.util.*;
public class Ats_TRT_Floder_Listener {
public static void main(String[] args) throws Exception {
// 将文件目录读取出来,存储为一个map结构
String file_path = "指定文件目录";
Map file_path_map = new HashMap();
file_path_map = readFiles(file_path, file_path_map);
//创建一个文件系统的监听服务
WatchService watchService = FileSystems.getDefault().newWatchService();
Path path = Paths.get(file_path);
//为该文件夹注册监听,监听新建、修改、删除事件。只能为文件夹(目录)注册监听,不能为单个文件注册监听
path.register(watchService, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_MODIFY, StandardWatchEventKinds.ENTRY_DELETE);
//编写事件处理
while (true) { //一直监听
//拉取一个WatchKey。当触发监听的事件时,就会产生一个WatchKey,此WatchKey封装了事件信息。
WatchKey watchKey = watchService.take();
//使用循环是因为这一个WatchKey中可能有多个文件变化了,比如Ctrl+A全选,然后删除,只触发了一个WatchKey,但有多个文件变化了
for (WatchEvent event : watchKey.pollEvents()) {
System.out.println(event.context() + "发生了" + event.kind() + "事件!");
if ("ENTRY_MODIFY".equals(event.kind()+"")){
String s = event.context().toString();
Map file_map = file_path_map.get(file_path + "\" + s); // 获取修改文件夹的文件
// 获取当前时间指定文件夹下的文件数量
File file = new File(file_path + "\" + s);
File[] files = file.listFiles();
List files1 = Arrays.asList(files);
ArrayList files_String = new ArrayList();
for (File file1 : files1) {
files_String.add(file1.getPath());
}
if (files1.size() < file_map.size()){
// 说明有文件被删除了
Set fileName = file_map.keySet();
Iterator iterator = fileName.iterator();
while (iterator.hasNext()){
String next = iterator.next();
boolean contains = files_String.contains(next);
if (!contains){
// 不包含
String [] to = {"收邮件地址"};
MailService.sendmail("TRT 图片删除", "发邮件的地址",
to, null, next, null, "text/html;charset=utf-8");
}
}
}
file_path_map.clear();
file_path_map = readFiles(file_path, file_path_map);
}
if("ENTRY_CREATE".equals(event.kind()+"")){ // 当有新建时 更新文件的map结构
file_path_map.clear();
file_path_map = readFiles(file_path, file_path_map);
}
}
//虽然是while()循环,但WatchKey和ByteBuffer一样,使用完要重置状态,才能继续用。
watchKey.reset(); //如果不重置,WatchKey使用一次过后就不能再使用,即只能监听到一次文件变化。
}
}
public static Map readFiles(String dirPath, Map fileAndDirMap) {
// 建立当前目录中文件的File对象
File curfile = new File(dirPath);
// 取得代表目录中所有文件的File对象数组
File[] list = curfile.listFiles();
if (list != null) {
for (File file : list) {
if (file.isDirectory()) {
//获取文件当前最近一次修改日期
long l = file.lastModified();
//以当前系统时间为准三十天前日期
Calendar theCa = Calendar. getInstance ();
theCa .setTime( new Date() );
theCa .add(Calendar.DATE, -30);
Date start = theCa .getTime();
long time = start.getTime();
if (l