• 文件夹比较 java递归比较文件夹


    手工发布程序到多个节点,没有做自动同步,偶尔会出现节点程序不一致的情况,所以写了个文件夹比较的小程序,用于对比两个文件夹内文件的不同。

    import java.io.File;

    import java.io.FileInputStream;

    import java.math.BigInteger;

    import java.security.MessageDigest;

    import java.util.HashMap;

    import java.util.Iterator;

    import java.util.Map;

     

    public class DirDiff {

        /**

         * 获取单个文件的MD5值!

         *

         * @param file

         * @return

         */

        public static String getFileMD5(File file) {

            if (!file.isFile()) {

                return null;

            }

            MessageDigest digest = null;

            FileInputStream in = null;

            byte buffer[] = new byte[1024];

            int len;

            try {

                digest = MessageDigest.getInstance("MD5");

                in = new FileInputStream(file);

                while ((len = in.read(buffer, 0, 1024)) != -1) {

                    digest.update(buffer, 0, len);

                }

                in.close();

            } catch (Exception e) {

                e.printStackTrace();

                return null;

            }

            BigInteger bigInt = new BigInteger(1, digest.digest());

            return bigInt.toString(16);

        }

     

        /**

         * 获取文件夹中文件的MD5值

         *

         * @param file

         * @param listChild

         * ;true递归子目录中的文件

         * @return

         */

        public static Map<String, String> getDirMD5(File file, boolean listChild) {

            if (!file.isDirectory()) {

                return null;

            }

            Map<String, String> map = new HashMap<String, String>();

            String md5;

            File files[] = file.listFiles();

            for (int i = 0; i < files.length; i++) {

                File f = files[i];

                if (f.isDirectory() && listChild) {

                    map.putAll(getDirMD5(f, listChild));

                } else {

                    md5 = getFileMD5(f);

                    if (md5 != null) {

                        map.put(f.getPath(), md5);

                    }

                }

            }

            return map;

        }

     

        public static void main(String[] args) {

     

            String dir1 = "D:\temp\server1";

            String dir2 = "D:\temp\server2";

            

            Map<String, String> map = getDirMD5(new File(dir1), true);

            Map<String, String> map2 = getDirMD5(new File(dir2), true);

            

            Iterator<String> it = map.keySet().iterator();

            while(it.hasNext()){

                String key = it.next();

                String key2 = key.replace(dir1, dir2);

                String value = map.get(key);

                String value2 = map2.remove(key2);

                if(value2 == null){

                    System.out.println(key + " -> " + value + " || 文件不存在" );

                }else if (!value.equals(value2)){

                    System.out.println(key + " -> " + value + " || " + value2 );

                }

            }

            

            it = map2.keySet().iterator();

            while(it.hasNext()){

                String key = it.next();

                System.out.println("文件不存在 || " + key + " -> " + map2.get(key));

            }

            

        }

     

    }

  • 相关阅读:
    在网页中象GMAIL一样检测客户端是否连接到网络
    How to adjust IFrame height on it's content (转载)
    asp.net工程中aspx文件与codebehind文件的关联问题
    一个在VC中调用web service的方法
    往mssql 表的自增长字段中添加值
    iis7上安装php5+mysql
    试用淘宝开放平台
    关于IOCP的方方面面
    Overlapped I/O
    为什么需要allocator的rebind接口
  • 原文地址:https://www.cnblogs.com/ooobj/p/4270531.html
Copyright © 2020-2023  润新知