用于需找线上系统与准备发布的系统之间的文件差异,并生成差异文件列表。包括寻找有修改的文件,新增的文件和需要删除的文件。

使用步骤,

1 eclipse导入maven工厂;

2 打开IncrementalUpdatetools.java

3 更改类里面的常量LASTEST_FILE_PATH,改为你自己的指定的增量文件存放的目录,必须保证该目录是空的。

4 右键run as java application

5 在控制台输入需要比较的两个工程的项目路径,其中第一个输入的是正在线上运行的项目目录,第二个输入的是准备发布的项目目录

已知问题,

1 增量文件和文件夹的修改时间和创建时间会发生变动。(fixed)

备注,

未经详细测试(在windows文件系统进行过简单测试,linux未进行测试)

有问题,请反馈。谢谢

下载地址

http://down.51cto.com/data/1096372

package com.chase;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.regex.Pattern;
import org.apache.commons.io.FileUtils;
/**** @author 404646846@qq.com* @Version : V<1.0> <Mar 01, 2014>*/
public class IncrementalUpdateTools {//增量后的文件存放地址,运行本程序前,请保证改目录为空目录public static final String LASTEST_FILE_PATH = "/difference";public static String originalPath;public static String destinationPath;public final static String WAR_FILE_NAME = "web";//不参与对比的文件和文件夹public final static String[] skippedFiles = { "([.]svn)","([.]bak)","([.]svn-base)", "(Thumbs[.]db)" };/*** 获取从控制台输入的目录路径** @author 404646846@qq.com* @param name*            提示* @return 返回目录*/public static File path2File(String name) {System.out.println("请输入" + name + "的目录:");byte[] b = new byte[1024];int n;File f = null;String pathStr;try {while (null == f || !f.exists()) {n = System.in.read(b);pathStr = new String(b, 0, n - 2);f = new File(pathStr);if (f.exists()) {break;} else {System.out.println(name + "的目录不存在!请重新输入:");}}} catch (IOException e) {e.printStackTrace();}return f;}public static boolean regexMatch(String regex, String name) {Pattern p;p = Pattern.compile(regex);return p.matcher(name).find();}/*** 获取文件MD5值** @author 404646846@qq.com* @param ff*            目录* @param pathStr*            目录的路径* @return*/public static Map<String, String> allFiles(File ff, String pathStr) {Map<String, String> map = new HashMap<String, String>();File[] files = ff.listFiles();String filePath, fileMD5;StringBuffer sb = new StringBuffer();boolean flag = false;;FileInputStream fis;try {for (File f : files) {for (String s : skippedFiles) {if (regexMatch(s, f.getName())) {sb.append(s + "    match    ---->      "+ f.getName() + " \n");flag = true;break;}}if (flag){flag = false;continue;}if (f.isFile()) {filePath = f.getAbsolutePath();fis = new FileInputStream(f);fileMD5 = org.apache.commons.codec.digest.DigestUtils.md5Hex(fis);System.out.println(filePath);map.put(filePath.replace(pathStr, ""), fileMD5);} else {map.putAll(allFiles(f, pathStr));}}if(null != sb && !"".equals(sb.toString())){System.out.println("跳过了文件,");System.out.println(sb.toString());}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}return map;}/*** 对比两个map,返回是否存在新增,修改或者删除的文件** @author 404646846@qq.com* @param oMap*            源目录* @param dMap*            修改后的目录* @return*/public static List<List<String>> mapComparison(Map<String, String> oMap,Map<String, String> dMap) {Entry<String, String> dEntry;List<String> amendedList = new ArrayList<String>(), diffList = new ArrayList<String>();List<List<String>> list = new ArrayList<List<String>>();int counter = 0;Iterator<Entry<String, String>> it = dMap.entrySet().iterator();while (it.hasNext()) {dEntry = it.next();if (oMap.containsKey(dEntry.getKey())) {// 如果存在这个文件if (oMap.get(dEntry.getKey()).equals(dEntry.getValue())) {// 如果文件相同} else {amendedList.add(dEntry.getKey());}} else {// 文件不存在diffList.add(dEntry.getKey());}counter++;}list.add(amendedList);list.add(diffList);return list;}/*** 复制文件** @author 404646846@qq.com* @param srcFile*            源文件* @param destFile*            目标地址*/public static boolean copyFile(File srcFile, File destFile) {boolean f = false;try {// System.out.println("准备将  " + srcFile.getAbsolutePath() + " 移动至 "// + destFile.getAbsolutePath() + " ");if (destFile.exists()) {throw new Exception("文件已经存在!文件移动失败!");}if (!destFile.getParentFile().exists()) {// System.out.println("正在创建:" + destFile.getParent());if (!destFile.getParentFile().mkdirs()) {throw new Exception("创建文件夹失败!");} else {// System.out.println("成功创建文件夹!");}}destFile.setLastModified(srcFile.lastModified());// FileInputStream fis = new FileInputStream(srcFile);// FileOutputStream fos = new FileOutputStream(distFile);// FileChannel fic = fis.getChannel();// FileChannel foc = fos.getChannel();// foc.transferFrom(fic, 0, fic.size());// fic.close();// foc.close();// fis.close();// fos.close();FileUtils.copyFile(srcFile, destFile, true);f = true;// System.out.println("成功将  " + srcFile.getAbsolutePath() + " 移动至 "// + destFile.getAbsolutePath() + " ");} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}return f;}public static void main(String[] args) {String originalPathStr, destPathStr;Map<String, String> oMap, dMap;List<List<String>> list;List<String> amendList, diffList;File ff = path2File("现有系统的文件");originalPathStr = ff.getAbsolutePath();oMap = allFiles(ff, originalPathStr);ff = path2File("修改后的系统文件");destPathStr = ff.getAbsolutePath();dMap = allFiles(ff, destPathStr);System.out.println("开始寻找有修改和新增的文件!");list = mapComparison(oMap, dMap);System.out.println("结束寻找有修改和新增的文件!");amendList = list.get(0);// 有改动的文件diffList = list.get(1);// 新增的文件System.out.println("开始复制差异文件!");for (String amendFile : amendList) {copyFile(new File(destPathStr + File.separator + amendFile),new File(LASTEST_FILE_PATH + File.separator + amendFile));}for (String diffFile : diffList) {copyFile(new File(destPathStr + File.separator + diffFile),new File(LASTEST_FILE_PATH + File.separator + diffFile));}System.out.println("差异文件复制结束!");System.out.println("开始寻找需要删除的文件!");list = mapComparison(dMap, oMap);System.out.println("结束寻找需要删除的文件!");amendList = list.get(0);// 有改动的文件System.out.println("有" + amendList.size() + "个文件需要更新:");for (String diffFile : amendList) {System.out.println(originalPathStr + File.separator + diffFile);}diffList = list.get(1);// 删除的文件System.out.println("有" + diffList.size() + "个文件需要从原始目录删除:");for (String diffFile : diffList) {System.out.println(originalPathStr + File.separator + diffFile);}System.out.println("获取增量文件结束!");}
}

转载于:https://blog.51cto.com/uchase/1365799

文件比较 增量 更新 系统发布 增量更新相关推荐

  1. Linux命令更新系统时间,更新所有文件的时间(转)

    https://blog.csdn.net/ccj2020/article/details/76026606 转载于:https://www.cnblogs.com/erhu-67786482/p/9 ...

  2. linux系统怎么刷新,Fedora Linux如何更新系统

    导读 本快速教程介绍了更新 Fedora Linux 安装的多种方法. 前几天,我安装了新发布的 Fedora 31.老实说,这是我第一次使用非 Ubuntu 发行版. 安装 Fedora 之后,我做 ...

  3. 计算机能进入系统但是桌面不动,电脑一直显示更新系统,但是很久了都不动,无法进入桌面,怎么回事...

    电脑一直显示更新系统,但是很久了都不动,无法进入桌面,怎么回事以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 电脑一直显 ...

  4. win10桌面管理文件收纳_微软win10发布7月更新,三大版本同步更新,着重提升系统安全性...

    2020年7月14日,微软windows10系统发布了07累积更新,对2004版.1909版和1903版三大版本win10系统同步推送更新补丁,其中win10的2004版的07累积更新补丁为KB456 ...

  5. clickhouse初学以及利用ck实现BI系统的增量更新

    文章目录 概述 适用场景 库引擎(部分) 1.Atomic 2.Lazy 3.Mysql.SQLite.PostergreSQL等一系列 数据类型(部分) 表引擎-合并树系列 ReplacingMer ...

  6. android+后台自动更新+上架,Android增量自动更新

    抽取的Android自动更新库,目的是几行代码引入更新功能,含服务端代码,欢迎Star,欢迎Fork,谢谢- 目录 功能介绍 [x] 支持全量更新apk,直接升级到最新版本 [x] 支持增量更新,只下 ...

  7. electron重启后更新_Electron~增量更新和全量更新

    增量更新说明文档 增量更新指的是本地发布前通过打包生成dist,压缩成app.zip包,上传到服务器:客户端每次重启执行一次检测更新,比较本地与远程json的版本,如果有最新版本,则获取zip包并解压 ...

  8. 不想升级,iOS系统自动更新可彻底关闭! 2016-05-23 16:38 更新/自动/on 昨天笔者发布了一篇关于iOS系统总提醒更新,到底要不要升级的文章,不少读者在微信上留言给笔者, iPhon

    转自:http://www.sohu.com/a/76743973_426094 不想升级,iOS系统自动更新可彻底关闭! 2016-05-23 16:38 更新/自动/on 昨天笔者发布了一篇关于i ...

  9. Solr的增量更新和全量更新对比

    Solr的增量更新和全量更新 solr的简介 solr是一个采用java语言,基于Lucene的全文搜索引擎. solr的一些原理 solr通过数据库的数据导入到索引库中,并且给数据创建相应的索引,用 ...

  10. 一键自动发布ipa(更新svn,拷贝资源,压缩资源,加密图片资源,加密数据文件,加密lua脚本,编译代码,ipa签名,上传ftp)...

    一键自动发布ipa(更新svn,拷贝资源,压缩资源,加密图片资源,加密数据文件,加密lua脚本,编译代码,ipa签名,上传ftp) 程序员的生活要一切自动化,更要幸福^_^. 转载请注明出处http: ...

最新文章

  1. Problem 5 素数筛法+并查集
  2. 统计用户在某一页停留的时间
  3. 计算机删除等级列在哪里,插入与删除Excel表格的单元格、行和列
  4. 计算机语言缺省,揭秘物联网必学语言——C语言与C++的区别
  5. iOS项目中常见定时器
  6. 人在低谷是最应该看的六句话!(深度好文)
  7. C++引用和指针区别
  8. Redis 面试 8 连问,你能顶住几道?
  9. Eclipse 中最常用的快捷键大全
  10. CSDN:如何获得C币
  11. 计算机网络实验-路由器IP地址配置及直连网络和ARP协议分析
  12. 卫星影像离线数据包(免费下载)
  13. ado控件 怎么链接mysql_使用ADO或ADO控件访问数据库
  14. 电驴怎么显示服务器列表,(转)如何更新电驴服务器列表(eMule Server List)
  15. commit work php,GitHub - sbzhu/weworkapi_php: official lib of wework api
  16. 继机器人披萨后,我又吃了个机器人汉堡!
  17. ▲ Android 签到打卡效果
  18. 【动手撸深度学习】细粒辨花 一文实践清华博士Densenet
  19. 白侠机器人_白侠微信多群直播机器人,引领全新直播潮流
  20. [转]诺奖得主警告人类不应和外星人说话

热门文章

  1. Xcode连接git@osc
  2. 背景建模与前景检测之二(Background Generation And Foreground Detection Phase 2)
  3. 移动端数据爬取和Scrapy框架
  4. Zabbix实现自动发现端口并监控
  5. 【自动化__持续集成】___java___猜数字
  6. Eclipse中servlet显示无法导入javax.servlet包问题的解决方案
  7. openstack--5--控制节点和计算节点安装配置nova
  8. GridView 设置背景透明以及Item的点击动画
  9. Daily Scrum 11/06
  10. 深度神经网络分布式训练指引