1 public class TestFolderCompare {
2
3 /**
4 * 根据路径获取所有的文件夹和文件,及文件的md5值
5 * @param path 路径
6 */
7 private static Map<String, FileModel> getFiles(String path) throws IOException {
8 Map<String, FileModel> map = new HashMap<String, FileModel>();
9 File folder = new File(path);
10 Object[] files = getFileList(folder).toArray();
11 Arrays.sort(files);
12 for (Object obj : files) {
13 File file = (File) obj;
14 // 去掉根目录,正则的\\\\,转义为java的\\,再转义为\
15 String key = file.getAbsolutePath().replaceAll("\\\\", "/").replaceAll(path, "");
16 String md5 = "";// 文件夹不比较md5值
17 if (file.isFile()) {
18 md5 = DigestUtils.md5Hex(new FileInputStream(file));
19 }
20 FileModel fileModel = new FileModel(file, md5);
21 map.put(key, fileModel);
22 }
23 return map;
24 }
25
26 /**
27 * 递归获取路径下所有文件夹和文件
28 * @param folder 文件路径
29 */
30 private static List<File> getFileList(File folder) {
31 List<File> list = new ArrayList<File>();
32 File[] files = folder.listFiles();
33 for (File file : files) {
34 list.add(file);
35 if (file.isDirectory()) {
36 List<File> fileList = getFileList(file);
37 list.addAll(fileList);
38 }
39 }
40 return list;
41 }
42
43 /**
44 * 比较两个文件集合的不同
45 * @param fileMap1 文件集合
46 * @param fileMap2 文件集合
47 */
48 public static List<FileModel> compareFile(Map<String, FileModel> fileMap1, Map<String, FileModel> fileMap2) {
49 List<FileModel> list = new ArrayList<FileModel>();
50 for (String key : fileMap1.keySet()) {
51 FileModel fileModel1 = fileMap1.get(key);
52 FileModel fileModel2 = fileMap2.get(key);
53 // 将fileMap2中没有的文件夹和文件,添加到结果集中
54 if (fileModel2 == null) {
55 list.add(fileModel1);
56 continue;
57 }
58 // 文件的md5值不同则add到比较结果集中
59 if (fileModel1.getFile().isFile() && !fileModel1.getMd5().equals(fileModel2.getMd5())) {
60 list.add(fileModel1);
61 }
62 }
63 return list;
64 }
65
66 public static void main(String[] args) throws IOException {
67 String path1 = "c:/a1";
68 String path2 = "c:/a2";
69 // 获取路径下所有文件夹和文件,及文件的md5值
70 Map<String, FileModel> fileMap1 = getFiles(path1);
71 Map<String, FileModel> fileMap2 = getFiles(path2);
72 List<FileModel> resultList = new ArrayList<FileModel>();
73 // 得到fileMap2中没有的文件夹和文件,及md5值不同的文件
74 resultList.addAll(compareFile(fileMap1, fileMap2));
75 // 得到fileMap1中没有的文件夹和文件,及md5值不同的文件
76 resultList.addAll(compareFile(fileMap2, fileMap1));
77 // 输出最终结果
78 for (FileModel fileModel : resultList) {
79 System.out.println(fileModel.getFile().getAbsolutePath() + " " + fileModel.getMd5());
80 }
81 }
82 }
|