栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java 对指定目录文件夹的监控

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java 对指定目录文件夹的监控

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 map = new HashMap();
                    fileAndDirMap.put(file.getPath(), map);
                    readFiles(file.getPath(), map);
                } else {
                    fileAndDirMap.put(file.getPath(), null);
                }
            }
        }
        // 遍历file数组
        return fileAndDirMap;
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/425331.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号