package tool;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.apache.log4j.Logger;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import org.jdom.xpath.XPath;
/**
* 代码提取更新工具
* @author Administrator
*
*/
public class MyToolApp
{
private static Logger logger = Logger.getLogger(MyToolApp.class);
// private Display display;
// private Shell shell;
private String text_directory; // 文件目录
private String text_outputdirectory;// 输出目录
private String text_starttime;
private String text_endtime;
private boolean containsSrc = false;//是否包含源码
private String directory;
private String projectName;//项目名称
private String outputdirectory;//输出目录
private long long_starttime;//开始时间
private long long_endtime;//结束时间
private boolean bool_starttime = false;//
private boolean bool_endtime = false;
private boolean bool = true;// 是否文件修改标志
private boolean isWebProject = false ;//是否web工程
private List<String> src = null;
private String output = "WebRoot/WEB-INF/classes";// 文本输出的目录
private String web_root_folder = "WebRoot";
private String configName;//src 要复制的源文件格式
// private String output = "bin";
//private String web_root_folder = "bin";
private int sumcount;
private int successcount;
private long start;
/**
* 更新文件
*/
public void open()
{
}
/**
* 更新文件操作
*/
public void search() {
this.start = System.currentTimeMillis();
/// 验证数据
validate();
this.sumcount = 0;
this.successcount = 0;
this.src = new ArrayList();
if (this.bool)
{
try {
// 读取class
readClassPath();
String str = "";
File f = null;
File file = null;
ArrayList list = null;
String abspath = "";
for (int i = 0; i < this.src.size(); i++) {
str = this.directory + "/" + (String)this.src.get(i);
f = new File(str);
if ((f.exists()) && (f.isDirectory())) {
list = getSubFiles(f);
if (!list.isEmpty()) {
for (int j = 0; j < list.size(); j++) {
file = (File)list.get(j);
abspath = file.getAbsolutePath().replace(File.separatorChar, '/');
// 获取最后修改时间
long long_file_time = file.lastModified();
if (!comperTime(Long.valueOf(long_file_time))) {
continue;
}
if (
IsSrcFile(abspath.toLowerCase())
)//java 文件 xml 文件
{
System.out.println("修改的文件:" + abspath);
String path = this.directory + "/" + this.output + abspath.substring(str.length());
int index = path.lastIndexOf(".");
String aterStr = abspath.substring(abspath.lastIndexOf("."));
//获取后缀
if(abspath.endsWith(".java")){
path = path.substring(0, index) + ".class";
}else{
path = path.substring(0, index) + aterStr ;
}
copy(path);
f = new File(path);
String name = f.getName();
int inex = name.lastIndexOf(".");
name = name.substring(0, inex);
List m = innerclass(f);
for (int k = 0; k < m.size(); k++) {
f = (File)m.get(k);
copy(f.getAbsolutePath());
}
if (!this.containsSrc){
continue;
}
// 复制src文件
copySrcFile(abspath, (String)this.src.get(i));
}
else
{
if (!comperTime(Long.valueOf(long_file_time)))
continue;
String path = this.directory + "/" + this.output + abspath.substring(str.length());
copy(path);
}
}
}
}
}
f = new File(this.directory + "/" + this.web_root_folder);
list = getSubFiles(f);
for (int i = 0; i < list.size(); i++) {
f = (File)list.get(i);
String path = f.getAbsolutePath().replace(File.separatorChar, '/');
if (path.indexOf(this.directory + "/" + this.output) <= -1) {
long long_file_time = f.lastModified();
if (!comperTime(Long.valueOf(long_file_time)))
continue;
copy(path);
}
}
}
catch (Exception e) {
msg("解析应用程序配置文件出错:" + e.getMessage(), 1);
}
long end = System.currentTimeMillis();
System.out.println("共用 " + (end - this.start) + "毫秒");
String text = "本次总更新文件数 " + this.sumcount + ",成功更新文件数 " + this.successcount ;
System.out.println(text);
msg("本次总更新文件数 " + this.sumcount + ",成功更新文件数 " + this.successcount);
try {
if (this.successcount > 0)
Runtime.getRuntime().exec("explorer.exe " + this.outputdirectory.replace('/', File.separatorChar));
} catch (IOException e) {
msg("请手动查看输出目录");
}
}
}
public boolean copy(String path)
{
this.sumcount += 1;
path = path.replace(File.separatorChar, '/');
String newpath = null;
if (this.containsSrc)
newpath = this.outputdirectory + "/" + this.projectName + "/" + this.web_root_folder + path.substring(this.directory.length() + this.web_root_folder.length() + 1);
else
newpath = this.outputdirectory + "/" + this.projectName + path.substring(this.directory.length() + this.web_root_folder.length() + 1);
File f = new File(path);
File ff = new File(newpath);
System.out.println(newpath);
boolean bool = copyFile(f, ff);
if (bool)
this.successcount += 1;
return bool;
}
public boolean copySrcFile(String path, String srcName)
{
this.sumcount += 1;
path = path.replace(File.separatorChar, '/');
String newpath = this.outputdirectory + "/" + this.projectName + "/" + srcName + path.substring(this.directory.length() + srcName.length() + 1);
File f = new File(path);
File ff = new File(newpath);
// System.out.println(newpath);
boolean bool = copyFile(f, ff);
if (bool)
this.successcount += 1;
return bool;
}
public boolean comperTime(Long l)
{
boolean flag = false;
if ((this.bool_starttime) && (this.long_starttime > l.longValue())) {
return flag;
}
if ((this.bool_endtime) && (this.long_endtime < l.longValue()))
return flag;
return !flag;
}
public List<File> innerclass(File file)
{
int pos = file.getName().lastIndexOf(".");
String shortname = file.getName().substring(0, pos);
File parent = file.getParentFile();
List list = new ArrayList();
if ((parent.exists()) && (parent.isDirectory())) {
File[] flist = parent.listFiles();
File f = null;
for (int i = 0; i < flist.length; i++) {
f = flist[i];
int index = f.getName().indexOf(shortname + "$");
if (index == 0)
list.add(f);
}
}
return list;
}
public static ArrayList<File> getSubFiles(File baseDir)
{
ArrayList ret = new ArrayList();
if (baseDir.exists()) {
File[] tmp = baseDir.listFiles();
if (tmp != null) {
for (int i = 0; i < tmp.length; i++) {
if ((tmp[i].isFile()) && (!tmp[i].isHidden())) {
ret.add(tmp[i]);
}
if ((tmp[i].isDirectory()) && (!tmp[i].isHidden())) {
ret.addAll(getSubFiles(tmp[i]));
}
}
}
tmp = (File[])null;
return ret;
}
return null;
}
public static boolean copyFile(File oldFile, File newFile)
{
boolean flag = false;
try {
File f = new File(newFile.getParent());
if (!f.exists())
f.mkdirs();
long l = oldFile.lastModified();
FileInputStream input = new FileInputStream(oldFile);
FileOutputStream output = new FileOutputStream(newFile);
int len = 0;
byte[] buffer = new byte[1024];
while ((len = input.read(buffer)) != -1) {
output.write(buffer, 0, len);
}
input.close();
output.flush();
output.close();
newFile.setLastModified(l);
if (newFile.exists())
flag = true;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return flag;
}
public void readClassPath()
throws Exception
{
initWebProject();
InputStream is = new FileInputStream(this.directory + "/.classpath");
SAXBuilder sb = new SAXBuilder();
Document doc = sb.build(is);
XPath xpath = XPath.newInstance("//classpath/classpathentry[@kind='src']");
List list = xpath.selectNodes(doc);
Element ele = null;
for (int i = 0; i < list.size(); i++) {
ele = (Element)list.get(i);
this.src.add(String.valueOf(ele.getAttributeValue("path").replace(File.separatorChar, '/')));
}
xpath = XPath.newInstance("//classpath/classpathentry[@kind='output']");
list = xpath.selectNodes(doc);
if ((list != null) && (list.size() > 0)) {
ele = (Element)list.get(0);
this.output = ele.getAttributeValue("path").replace(File.separatorChar, '/');
if(!isWebProject){
this.web_root_folder = web_root_folder;
}else{
int index = this.output.lastIndexOf("/WEB-INF/classes");
this.web_root_folder = this.output.substring(0, index);
}
}
}
/**
* 初始验证是否web项目
* @throws Exception
*/
public void initWebProject()
throws Exception
{
InputStream is = new FileInputStream(this.directory + "/.classpath");
SAXBuilder sb = new SAXBuilder();
Document doc = sb.build(is);
XPath xpath = null;
// XPath xpath = XPath.newInstance("//classpath/classpathentry[@kind='src']");
List list =null ;
Element ele = null;
xpath = XPath.newInstance("//classpath/classpathentry[@kind='output']");
list = xpath.selectNodes(doc);
if ((list != null) && (list.size() > 0)) {
ele = (Element)list.get(0);
this.output = ele.getAttributeValue("path").replace(File.separatorChar, '/');
if(this.output.indexOf("bin")>-1){
output = "bin";
web_root_folder = "bin";
isWebProject = false;
}
}
}
public void validate()
{
/////////验证是否为web项目
try
{
initWebProject();
File f = null;
Date date = null;
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
if ("".equals(this.text_directory.trim())) {
msg("项目目录不能为空");
this.bool = false;
return;
}
if ("".equals(this.text_outputdirectory.trim())) {
msg("输出目录不能为空");
this.bool = false;
return;
}
f = new File(this.text_directory + "/" + ".classpath");
if (!f.exists()) {
msg("项目目录无效");
this.bool = false;
return;
}
f = f.getParentFile();
this.directory = f.getAbsolutePath().replace(File.separatorChar, '/');
this.projectName = f.getName();
f = new File(this.text_outputdirectory);
if ((!f.exists()) && (!f.isDirectory())) {
msg("输出目录无效");
this.bool = false;
return;
}
f = new File(this.text_outputdirectory + "/updatetool");
f.mkdirs();
if (!f.exists()) {
msg("输出目录无法操作");
this.bool = false;
return;
}
del(this.text_outputdirectory + "/updatetool");
f.mkdirs();
this.outputdirectory = f.getAbsolutePath().replace(File.separatorChar, '/');
if (this.outputdirectory.indexOf(this.directory) > -1) {
msg("输出目录选择错误", 1);
this.bool = false;
return;
}
if (!"".equals(this.text_starttime.trim())) {
try {
date = format.parse(this.text_starttime.trim());
this.long_starttime = date.getTime();
this.bool_starttime = true;
} catch (ParseException e) {
msg("开始时间格式不符合要求", 1);
this.bool = false;
return;
}
}
if (!"".equals(this.text_endtime.trim())) {
try {
date = format.parse(this.text_endtime.trim());
this.long_endtime = date.getTime();
this.bool_endtime = true;
} catch (ParseException e) {
msg("结束时间格式不符合要求", 1);
this.bool = false;
return;
}
}
if ((this.bool_starttime) && (this.bool_endtime) && (this.long_starttime > this.long_endtime)) {
msg("开始时间晚于结束时间", 1);
this.bool = false;
return;
}
if ((!this.bool_starttime) && (!this.bool_endtime)) {
msg("时间范围不能全部为空", 1);
this.bool = false;
return;
}
////////////////////////////////////////////////////////////////////////////////////
}
catch (Exception e) {
e.printStackTrace();
msg("验证发生错误:" + e.getMessage(), 1);
this.bool = false;
return;
}
this.bool = true;
}
public static void del(String filepath)
throws IOException
{
File f = new File(filepath);
if ((f.exists()) && (f.isDirectory())) {
if (f.listFiles().length == 0) {
f.delete();
} else {
File[] delFile = f.listFiles();
int i = f.listFiles().length;
for (int j = 0; j < i; j++) {
if (delFile[j].isDirectory()) {
del(delFile[j].getAbsolutePath());
}
delFile[j].delete();
}
delFile = (File[])null;
}
} else if ((f.exists()) && (!f.isDirectory())) {
f.delete();
}
f = null;
}
public void msg(String msg, int icon)
{
/* MessageBox box = new MessageBox(this.shell, icon);
box.setText("消息");
box.setMessage(msg);
box.open();*/
}
public void msg(String msg)
{
msg(msg, 2);
}
public static void main(String[] args) throws Exception
{
// 设置目录 及其文件路径
// 项目路径 输出路径
// String text_directory = "F:\\work\\工作整理-xiaohua\\项目资料归档\\小项目\\提取工具\\源码\\MyUpdateTool"; // 文件目录
String text_directory = "C:\\Users\\sqh\\Workspaces\\MyEclipse 8.5\\WebPro" ;
String text_outputdirectory = "D:\\updatetool";// 输出目录
String text_starttime ="2016-06-06 00:00:00";// 开始时间
String text_endtime = "2016-06-07 00:00:00"; // 结束时间
boolean containsSrc = true ;//是否包含源码 false 不包含源码
String configName ="java,xml,properties" ;// 配置 提取的文件
MyToolApp app = new MyToolApp( text_directory , text_outputdirectory ,
text_starttime , text_endtime , containsSrc , configName);
// 查询文件
app.search();
}
public MyToolApp(){
}
/***
* 初始化工具
* @param text_directory 项目路径
* @param text_outputdirectory 输出目录
* @param text_starttime 开始时间
* @param text_endtime 结束时间
* @param containsSrc false 不包含源码 true 包含源码
*/
public MyToolApp(String text_directory , String text_outputdirectory ,
String text_starttime ,String text_endtime ,boolean containsSrc,
String configName
){
logger.info(" init MyToolApp ") ;
this.text_directory = text_directory ;
this.text_outputdirectory = text_outputdirectory ;
this.text_starttime = text_starttime ;
this.text_endtime = text_endtime ;
this.containsSrc = containsSrc ;
this.configName = configName ;// 配置 提取的文件
this.directory = text_directory ;
}
/**
* 验证是否为src的配置文件
* @param fileName
* @return
*/
public boolean IsSrcFile(String fileName){
boolean flag = false;
String appStr = null;
if(fileName!=null && !fileName.equals("")){
appStr = fileName.substring(fileName.lastIndexOf(".")+1);
if(configName.indexOf(appStr)>-1){
flag = true;
}
}
return flag;
}
}
相关推荐
6. **兼容性与更新**:考虑到短视频平台可能不断更新其反爬策略,无水印提取工具需要定期更新,以保持与最新平台规则的兼容性。开发者需要密切关注平台的变化,及时更新工具的算法和功能。 7. **法律法规遵守**:在...
1. **VVBOX FLV Downloader 1.0.0.0 云龙绿化版.exe**:这很可能是该FLV提取工具的安装或执行程序。"云龙绿化版"通常意味着这是经过第三方优化的版本,去除了不必要的组件,减少了资源占用,使得软件更加轻便且易于...
【金盾视频提取工具】是一种专门用于从特定数据源中提取视频内容的软件工具,尤其在处理金盾系统中的视频监控数据时表现出高效和专业性。金盾系统通常被广泛应用于公共安全、交通管理以及各类场所的安全监控,因此,...
网众无盘PNP提取工具是一款专门为无盘网络系统设计的实用软件,它的主要职能是从系统注册表中提取网卡的PNP驱动文件,并将其存储在本地或指定位置,便于后续的备份、更新或故障排查。该工具的出现极大地简化了无盘...
DELL 最新的BIOS提取工具是一款专为DELL计算机用户设计的应用程序,旨在帮助用户方便地获取和更新他们的系统BIOS。BIOS(基本输入输出系统)是计算机硬件与操作系统之间的一个关键接口,负责初始化和控制硬件设备。...
电脑BIOS提取工具主要用于获取BIOS的信息,包括其版本和型号,这对于系统维护、故障排查以及个性化定制BIOS设置具有重要意义。 标题中的“电脑BIOS提取工具”是指一种专门设计用于读取和提取BIOS固件信息的软件。...
标题中的“万能BIOS提取工具”指的是一个专门用于从各种品牌计算机主板中提取BIOS固件的软件工具。BIOS(Basic Input/Output System)是计算机启动时加载的初始程序,它负责硬件设备的基本设置和初始化。由于不同...
无人机POS数据提取工具是一款专为无人机用户设计的实用软件,主要功能是帮助用户从无人机拍摄的照片中提取位置信息,即POS(Position and Orientation System)数据。POS数据包含了无人机在拍摄时的具体位置和方向,...
标题中的“联想BIOS提取工具”是指专门用于从联想品牌的计算机BIOS(基本输入输出系统)中提取相关信息的软件工具。BIOS是计算机硬件与操作系统之间的一个基础接口,它负责在启动时执行初始化任务,并提供低级硬件...
炬力固件提取工具4.0版是一款专为MP3播放器设计的软件,主要用于从设备中提取固件,以便进行备份、更新或故障排除。固件,全称为设备固件(Firmware),是存储在电子设备内部的一种控制程序,它负责管理硬件设备的...
本资源提供了一个小程序源码提取工具,能够帮助开发者或爱好者深入理解小程序的内部结构,进行学习和研究。虽然描述中提到"仅供学习交流使用,不提供技术支持",但我们可以从中探讨一些关于小程序开发和源码分析的...
【金盾提取工具】是一款专为用户设计的视频提取软件,尤其针对"金盾2012提取"这一特定需求。这款工具旨在提供便捷的方法,帮助用户从各种网络资源中高效、安全地下载和提取所需的视频内容。在互联网上,由于版权保护...
【提取Web更新包工具详解】 在现代互联网应用的开发与维护过程中,快速、高效地发布更新是保持软件正常运行和用户体验的关键。"提取Web更新包工具"正是一款为解决这一问题而设计的专业软件,它旨在简化开发者的更新...
《视频提取音频工具详解》 在数字化多媒体时代,我们经常需要从视频中单独提取音频,例如,为了制作音乐播放列表或者用于其他项目。在这种情况下,一款高效易用的视频提取音频工具至关重要。本文将深入探讨...
矩力固件提取工具是一款专为IT专业人士设计的软件,主要用于从各种硬件设备或系统固件中提取关键数据。在日常的系统维护、故障排查、设备升级或逆向工程等场景下,这样的工具显得尤为实用。"超强的矩力固件提取工具...
会出现正式环境代码和本地不一致的情况,修改完功能后不能整体大war包更新,单个去查找自己修改过的文件及其困难,那么本工具就可以自动根据你的要求找出你想要的更新文件,包括jsp/js/css/xml/class等文件,省心...
由于游戏的更新可能会导致BNK文件结构发生变化,因此在使用提取工具时,必须确保它能够兼容当前的游戏版本。第二个是转换质量。不同工具的解码能力以及用户设置的输出格式,都可能影响最终导出音频的质量。第三个则...
"M2ts 提取分离工具"是一款专为处理M2TS视频格式而设计的应用程序,它主要用于从M2TS文件中提取或分离音频和视频流。M2TS是一种常见的高清视频格式,常见于Blu-ray Discs和一些数字摄像机录制的视频。这款工具的核心...
【小米ROM提取工具】是一款专为小米手机设计的刷机辅助软件,主要用于从官方更新文件中提取出完整的ROM包,方便用户进行个性化定制或者备份恢复系统。刷机是指更换手机的操作系统或系统组件,通常用于优化性能、增加...
115网盘连接提取工具是一款专为用户设计的实用软件,主要用于从115网盘分享链接中批量提取文件的实际下载地址。115网盘是中国较早提供云存储服务的平台之一,用户可以通过它上传、存储和分享各类文件。然而,115网盘...