日期:2014-05-20  浏览次数:20730 次

Java 如何监控文件目录的变化
Java如何监控某个目录下文件的变化,如文件增加、删除、修改,也包括子文件夹中的文件,有人建议使用jni,由于要跨平台,最好是纯java的,谢谢。

------解决方案--------------------
http://topic.csdn.net/t/20030708/09/2002243.html
------解决方案--------------------
提供个想法,也不知道算不算是最笨的。
利用File的listFiles() ,lastModified() ,isDirectory() 等方法
0.写个类用于记录目录结构
1.循环遍历需要监视的文件夹,记录下整个目录结构
2.隔个5秒,10秒的,再遍历一遍
3.比较两次取得的目录结构,是否相同
------解决方案--------------------
探讨
提供个想法,也不知道算不算是最笨的。
利用File的listFiles() ,lastModified() ,isDirectory() 等方法
0.写个类用于记录目录结构
1.循环遍历需要监视的文件夹,记录下整个目录结构
2.隔个5秒,10秒的,再遍历一遍
3.比较两次取得的目录结构,是否相同

------解决方案--------------------
弄个线程,隔段时间就扫一遍?
------解决方案--------------------
修改文件夹是通过java吗?如果是的话就很简单了
写事件类,写监听器,使用Proxy代理下就OK了!
如果不是通过java的话那就是用jni吧,或者只能是 线程扫描了。
------解决方案--------------------
探讨
修改文件夹是通过java吗?如果是的话就很简单了
写事件类,写监听器,使用Proxy代理下就OK了!
如果不是通过java的话那就是用jni吧,或者只能是 线程扫描了。

------解决方案--------------------
关注
------解决方案--------------------
up..很是有难度
------解决方案--------------------
探讨
我用轮询的方法,只能监控到根目录下的文件,子目录的却监控不到,大家帮帮忙

------解决方案--------------------
想到一个貌似简单的方法,不过是区别OS的,也就是你底层要设计得好。

1.利用command列出文件夹结构(包括子文件夹), 例如: widnows用 dir /S; solaris用 ls -r(具体参数记不清了),保存文件
2.隔段时间,再列一遍
3.然后比较两个文件

------解决方案--------------------
Java code

    /**
     * 递归扫描整个路径
     * 
     * @param file
     *            要扫描的路径
     * @param dirFileMap
     *            存放扫描结果
     */
    private void totalScan(File file, Map<String, String> dirFileMap) {

        String[] fileList = file.list();
        // 判断是否为空目录
        if (null != fileList) {
            for (int i = 0; i < fileList.length; i++) {
                String pname = file.getAbsolutePath() + "\\" + fileList[i];
                File tempFile = new File(pname);
                if (tempFile.isDirectory()) {
                    dirFileMap
                            .put("文件夹:" + pname, tempFile.lastModified() + "");//修改了此处
                    totalScan(tempFile, dirFileMap);
                } else {
                    // 不相同的文件夹下,存放的文件可能名字相同,但是同一路径下的文件肯定不会相同,
                    // 所以采用全路径做为key值
                    dirFileMap.put("文件:" + pname, tempFile.lastModified() + "");//修改了此处
                }
            }
        }
    }

    /**
     * 得到增加的文件及文件夹,并增加到已有的文件信息中
     */
    private void getAddedFile(Map<String, String> nowDirFileMap) {
        for (Iterator<String> iterator = nowDirFileMap.keySet().iterator(); iterator
                .hasNext();) {
            String key = iterator.next();
            String oldValue = oldDirFileMap.get(key);
            String newValue = nowDirFileMap.get(key);
            if (null == oldValue) {
                oldDirFileMap.put(key, newValue);
                System.out.println("新增的" + key);
            }
        }
    }

    /**
     * 得到删除的文件及文件夹,并删除已经不存在的文件信息
     */
    private void getDeletedFile(Map<String, String> nowDirFileMap) {
        for (Iterator<String> iterator = oldDirFileMap.keySet().iterator(); iterator
                .hasNext();) {
            String key = iterator.next();
            String oldValue = oldDirFileMap.get(key);
            String newValue = nowDirFileMap.get(key);
            if (null == nowDirFileMap.get(key)) {
                System.out.println("删除的" + key);
                iterator.remove();
                oldDirFileMap.remove(key);
            } else if (!newValue.equals(oldValue)) {//修改了此处
                System.out.println("修改的" + key);
                oldDirFileMap.put(key, newValue);
            }
        }
    }

    /**
     * 展示原有文件
     */
    private void displayNowFile() {
        System.out.println(dir + "路径原有文件目录如下:\n");
        Set set = oldDirFileMap.keySet();
        Iterator<String> iterator = set.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());//此处修改
        }
        System.out.println("========================");
    }