文件比较 增量 更新 系统发布 增量更新
用于需找线上系统与准备发布的系统之间的文件差异,并生成差异文件列表。包括寻找有修改的文件,新增的文件和需要删除的文件。
使用步骤,
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
文件比较 增量 更新 系统发布 增量更新相关推荐
- Linux命令更新系统时间,更新所有文件的时间(转)
https://blog.csdn.net/ccj2020/article/details/76026606 转载于:https://www.cnblogs.com/erhu-67786482/p/9 ...
- linux系统怎么刷新,Fedora Linux如何更新系统
导读 本快速教程介绍了更新 Fedora Linux 安装的多种方法. 前几天,我安装了新发布的 Fedora 31.老实说,这是我第一次使用非 Ubuntu 发行版. 安装 Fedora 之后,我做 ...
- 计算机能进入系统但是桌面不动,电脑一直显示更新系统,但是很久了都不动,无法进入桌面,怎么回事...
电脑一直显示更新系统,但是很久了都不动,无法进入桌面,怎么回事以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 电脑一直显 ...
- win10桌面管理文件收纳_微软win10发布7月更新,三大版本同步更新,着重提升系统安全性...
2020年7月14日,微软windows10系统发布了07累积更新,对2004版.1909版和1903版三大版本win10系统同步推送更新补丁,其中win10的2004版的07累积更新补丁为KB456 ...
- clickhouse初学以及利用ck实现BI系统的增量更新
文章目录 概述 适用场景 库引擎(部分) 1.Atomic 2.Lazy 3.Mysql.SQLite.PostergreSQL等一系列 数据类型(部分) 表引擎-合并树系列 ReplacingMer ...
- android+后台自动更新+上架,Android增量自动更新
抽取的Android自动更新库,目的是几行代码引入更新功能,含服务端代码,欢迎Star,欢迎Fork,谢谢- 目录 功能介绍 [x] 支持全量更新apk,直接升级到最新版本 [x] 支持增量更新,只下 ...
- electron重启后更新_Electron~增量更新和全量更新
增量更新说明文档 增量更新指的是本地发布前通过打包生成dist,压缩成app.zip包,上传到服务器:客户端每次重启执行一次检测更新,比较本地与远程json的版本,如果有最新版本,则获取zip包并解压 ...
- 不想升级,iOS系统自动更新可彻底关闭! 2016-05-23 16:38 更新/自动/on 昨天笔者发布了一篇关于iOS系统总提醒更新,到底要不要升级的文章,不少读者在微信上留言给笔者, iPhon
转自:http://www.sohu.com/a/76743973_426094 不想升级,iOS系统自动更新可彻底关闭! 2016-05-23 16:38 更新/自动/on 昨天笔者发布了一篇关于i ...
- Solr的增量更新和全量更新对比
Solr的增量更新和全量更新 solr的简介 solr是一个采用java语言,基于Lucene的全文搜索引擎. solr的一些原理 solr通过数据库的数据导入到索引库中,并且给数据创建相应的索引,用 ...
- 一键自动发布ipa(更新svn,拷贝资源,压缩资源,加密图片资源,加密数据文件,加密lua脚本,编译代码,ipa签名,上传ftp)...
一键自动发布ipa(更新svn,拷贝资源,压缩资源,加密图片资源,加密数据文件,加密lua脚本,编译代码,ipa签名,上传ftp) 程序员的生活要一切自动化,更要幸福^_^. 转载请注明出处http: ...
最新文章
- Problem 5 素数筛法+并查集
- 统计用户在某一页停留的时间
- 计算机删除等级列在哪里,插入与删除Excel表格的单元格、行和列
- 计算机语言缺省,揭秘物联网必学语言——C语言与C++的区别
- iOS项目中常见定时器
- 人在低谷是最应该看的六句话!(深度好文)
- C++引用和指针区别
- Redis 面试 8 连问,你能顶住几道?
- Eclipse 中最常用的快捷键大全
- CSDN:如何获得C币
- 计算机网络实验-路由器IP地址配置及直连网络和ARP协议分析
- 卫星影像离线数据包(免费下载)
- ado控件 怎么链接mysql_使用ADO或ADO控件访问数据库
- 电驴怎么显示服务器列表,(转)如何更新电驴服务器列表(eMule Server List)
- commit work php,GitHub - sbzhu/weworkapi_php: official lib of wework api
- 继机器人披萨后,我又吃了个机器人汉堡!
- ▲ Android 签到打卡效果
- 【动手撸深度学习】细粒辨花 一文实践清华博士Densenet
- 白侠机器人_白侠微信多群直播机器人,引领全新直播潮流
- [转]诺奖得主警告人类不应和外星人说话
热门文章
- Xcode连接git@osc
- 背景建模与前景检测之二(Background Generation And Foreground Detection Phase 2)
- 移动端数据爬取和Scrapy框架
- Zabbix实现自动发现端口并监控
- 【自动化__持续集成】___java___猜数字
- Eclipse中servlet显示无法导入javax.servlet包问题的解决方案
- openstack--5--控制节点和计算节点安装配置nova
- GridView 设置背景透明以及Item的点击动画
- Daily Scrum 11/06
- 深度神经网络分布式训练指引