程序安装,升级及卸载核心部分(java编写)
安装程序的工作:将源文件复制到相应的目录。
升级程序的工作:将源文件中更新过的文件覆盖目的文件,增加的文件复制到相应的目录。
卸载程序的工作:将程序文件夹的内容删除。
针对以上内容,写一个简单的安装程序
(主要文件:InstallSheildImpl,用递归的方式进行了文件夹的遍历)
/***********************************************************************
* Module: InstallSheild.Java
* Author: Administrator
* Created: 2004-12-13 22:37:53
* Purpose: 安装程序接口,用于统一调用方式。
***********************************************************************/
package org.heixue.test.install;
/**
* @author Administrator
*/
public interface InstallSheild {
public final static int INSTALL=1;
public final static int UPDATE=2;
public final static int UNINSTALL=3;
public void install(int type,String srcFold,String destFold) throws InstallException ;
}/***********************************************************************
* Module: InstallSheildImpl.java
* Author: Administrator
* Created: 2004-12-13 22:48:20
* Purpose: 安装程序的实现
***********************************************************************/
package org.heixue.test.install;
import java.io.*;
//import org.heixue.util.Log;
import org.heixue.util.FileLog;
import org.heixue.util.file.FileCopy;
/**
* @author Administrator
*/
public class InstallSheildImpl implements InstallSheild {
private String srcFold=null;
private String destFold=null;
private FileLog log=null;
/**
*
*/
public InstallSheildImpl {
}
/*
* @see org.heixue.test.update.InstallSheild#install(java.lang.String, java.lang.String, int)
*/
public void install(int type, String srcFold, String destFold) throws InstallException {
this.srcFold=srcFold;
this.destFold=destFold;
if(Config.getOut!=null)
log=new FileLog(Config.getOut);
else
log=new FileLog(System.out);
if(destFold==null) throw new InstallException("您没有设置目的文件夹位置!");
switch(type){
case InstallSheild.INSTALL: if(srcFold==null) throw new InstallException("您没有设置源文件夹位置!");doInstall;break;
case InstallSheild.UPDATE: if(srcFold==null) throw new InstallException("您没有设置源文件夹位置!");doUpdate;break;
case InstallSheild.UNINSTALL:doUninstall;break;
default:throw new InstallException("没有这项操作!");
}
}
/**
* :
* #pERPose: 安装程序,主要进行文件的拷贝.
*/
public void doInstall throws InstallException{
if(srcFold==null) throw new InstallException("您没有设置源文件夹位置!");
if(destFold==null) throw new InstallException("您没有设置目的文件夹位置!");
File file1=new File(srcFold);
File file2=new File(destFold);
if(!file2.exists) file2.mkdir;
installFiles("","");
}
private void installFiles(String src,String dest) throws InstallException{
File file1=new File(srcFold,src);
File file2=new File(destFold,dest);
if(file1.isFile){
log.info(file2.getPath);
FileCopy.copyByFile(file1,file2);
}else if(file1.isDirectory){
if(!file2.exists) file2.mkdir;
log.info(file2.getPath);
File fs=file1.listFiles;
for(int i=0;ibr /> String strPath=fs[i].getPath.substring(srcFold.length+1);
installFiles(strPath,strPath);
}
}else{
throw new InstallException("不存在该文件或目录!");
}
}
/**
* :
* #perpose: 升级程序,根据文件的创建日期进行判断更新
*/
public void doUpdate throws InstallException{
if(srcFold==null) throw new InstallException("您没有设置源文件夹位置!");
if(destFold==null) throw new InstallException("您没有设置目的文件夹位置!");
File file1=new File(srcFold);
File file2=new File(destFold);
if(!file2.exists) file2.mkdir;
updateFiles("","");
}
private void updateFiles(String src,String dest) throws InstallException{
File file1=new File(srcFold,src);
File file2=new File(destFold,dest);
if(file1.isFile){
if(!file2.exists||file1.lastModified>file2.lastModified){
log.info(file2.getPath);
FileCopy.copyByFile(file1,file2);
}
}else if(file1.isDirectory){
if(!file2.exists) file2.mkdir;
log.info(file2.getPath);
File fs=file1.listFiles;
for(int i=0;ibr /> String strPath=fs[i].getPath.substring(srcFold.length+1);
updateFiles(strPath,strPath);
}
}else{
throw new InstallException("不存在该文件或目录!");
}
}
/**
* :
* #perpose: 卸载程序,将目的文件夹下所有文件删除
*/
public void doUninstall throws InstallException{
if(destFold==null) throw new InstallException("您没有设置目的文件夹位置!");
deleteFiles("");
}
private void deleteFiles(String dest) throws InstallException{
File file1=new File(destFold,dest);
if(file1.isFile){
file1.delete;
log.info(file1.getPath);
}else if(file1.isDirectory){
File fs=file1.listFiles;
for(int i=0;ibr /> String strPath=fs[i].getPath.substring(srcFold.length+1);
deleteFiles(strPath);
}
file1.delete;
log.info(file1.getPath);
}else{
throw new InstallException("不存在该文件或目录!");
}
}
public static void main(String args) throws InstallException{
InstallSheildImpl isi=new InstallSheildImpl;
isi.install(InstallSheild.INSTALL,"d:\test","d:\test2");
//isi.install(InstallSheild.UPDATE,"d:\test","d:\test2");
//isi.install(InstallSheild.UNINSTALL,"d:\test","d:\test2");
}
}
/***********************************************************************
* Module: Config.java
* Author: Administrator
* Created: 2004-12-14 10:24:06
* Purpose: 一些配置信息
***********************************************************************/
package org.heixue.test.install;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStream;
/**
* @author Administrator
*/
public class Config {
private static int installType=0;
private static String srcFold=null;
private static String destFold=null;
private static OutputStream out=null;
private static Config _config = null;
/**
*
*/
public void initialize(int type,String src,String dest,String logPath) throws FileNotFoundException {
if(logPath!=null)
out = new FileOutputStream(logPath);
initialize(type,src,dest,out);
}
/**
* @param type :安装类型
* @param src :源文件夹
* @param dest :目标文件夹
* @param o :日志流输出
*/
public void initialize(int type,String src,String dest,OutputStream o){
installType=type;
srcFold=src;
destFold=dest;
out=o;
}
/**
* @return:
* #perpose:
*/
public static String getDestFold {
return destFold;
}
/**
* @return:
* #perpose:
*/
public static int getInstallType {
return installType;
}
/**
* @return:
* #perpose:
*/
public static OutputStream getOut {
return out;
}
/**
* @return:
* #perpose:
*/
public static String getSrcFold {
return srcFold;
}
/**
* @return:
* #perpose:
*/
public static Config getInstance {
if(_config==null)
_config = new Config;
return _config;
}
}
/***********************************************************************
* Module: InstallException.java
* Author: Administrator
* Created: 2004-12-13 22:53:25
* Purpose: 安装过程异常
***********************************************************************/
package org.heixue.test.install;
/**
* @author Administrator
*/
public class InstallException extends Exception {
/**
*
*/
public InstallException {
super;
}
public InstallException(String reason) {
super(reason);
}
}/***********************************************************************
* Module: Install.java
* Author: Administrator
* Created: 2004-12-14 10:53:28
* Purpose: 安装文件的类,输入参数:安装类型,源文件夹,目标文件夹,日志文件
***********************************************************************/
package org.heixue.test.install;
import java.io.FileNotFoundException;
/**
* @author Administrator
*/
public class Install {
/**
*
*/
public Install {
super;
// TODO Auto-generated constructor stub
}
public static void main(String args) throws FileNotFoundException, InstallException{
int installType=0;
String srcFold=null;
String destFold=null;
String logPath=null;
if(args.length==4){
if(args[0].equals("install")){
installType=InstallSheild.INSTALL;
}else if(args[0].equals("update")){
installType=InstallSheild.UPDATE;
}else if(args[0].equals("uninstall")){
installType=InstallSheild.UNINSTALL;
}else{
}
srcFold=args[1];
destFold=args[2];
logPath=args[3];
if(logPath.equals("null"))
logPath=null;
Config.getInstance.initialize(installType,srcFold,destFold,logPath);
InstallSheild is = new InstallSheildImpl;
is.install(installType,srcFold,destFold);
}else{
System.out.println("command line:java Install Type srcFold destFold logPath");
System.out.println("eg:java Install install d:\test d:\test2 d:\install.log");
}
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
其下是两个工具类
/***********************************************************************
* Module: FileCopy.java
* Author: Administrator
* Created: 2004-12-6 22:20:15
* Purpose: 文件复制
***********************************************************************/
package org.heixue.util.file;
import java.io.*;
/**
* @author Administrator
*/
public class FileCopy {
/**
*
*/
public FileCopy {
}
public static boolean copy(String src,String dest){
try{
//instance the File as file_in and file_out
java.io.File file_in=new java.io.File(src);
java.io.File file_out=new java.io.File(dest);
FileInputStream in1=new FileInputStream(file_in);
FileOutputStream out1=new FileOutputStream(file_out);
byte bytes=new byte[1024];
int c;
while((c=in1.read(bytes))!=-1)
out1.write(bytes,0,c);
in1.close;
out1.close;
return(true); //if success then return true
}
catch(Exception e)
{
System.out.println("Error!");
return(false); //if fail then return false
}
}
public static boolean copyByFile(File src,File dest){
try{
//instance the File as file_in and file_out
FileInputStream in1=new FileInputStream(src);
FileOutputStream out1=new FileOutputStream(dest);
byte bytes=new byte[1024];
int c;
while((c=in1.read(bytes))!=-1)
out1.write(bytes,0,c);
in1.close;
out1.close;
return(true); //if success then return true
}
catch(Exception e)
{
System.out.println(e.toString);
return(false); //if fail then return false
}
}
}/***********************************************************************
* Module: FileLog.java
* Author: Administrator
* Created: 2004-12-6 22:20:15
* Purpose: 产生文件日志
***********************************************************************/
package org.heixue.util;
import java.io.FileNotFoundException;
import java.io.IOException;
/**
* @author heixue
*
*/
public class FileLog {
private String logFilePath="/usr/tomcat_log.txt";//"c:\tomcat_log.txt"
java.io.OutputStream outputStream=null;
/**
*
*/
public FileLog {
super;
}
/**
* @param stream:输出流
*/
public FileLog(java.io.OutputStream stream) {
outputStream=stream;
}
/**
* @param filepath:文件路径
*/
public FileLog(String filepath) {
super;
try {
outputStream= new java.io.FileOutputStream(filepath,true);
} catch (FileNotFoundException e) {
e.printStackTrace;
}
}
public void error(String str){
java.util.Date date=new java.util.Date;
String time=(date.getYear+1900)+"-"+(date.getMonth+1)+"-"+date.getDate+" "+date.getHours+":"+date.getMinutes+":"+date.getSeconds;
str="error:"+time+"-->"+str+"n";
if(outputStream!=null) try {
this.outputStream.write(str.getBytes);
this.outputStream.flush;
} catch (IOException e) {
e.printStackTrace;
}
}
public void info(String str){
java.util.Date date=new java.util.Date;
String time=(date.getYear+1900)+"-"+(date.getMonth+1)+"-"+date.getDate+" "+date.getHours+":"+date.getMinutes+":"+date.getSeconds;
str="info:"+time+"-->"+str+"n";
if(outputStream!=null) try {
this.outputStream.write(str.getBytes);
this.outputStream.flush;
} catch (IOException e) {
e.printStackTrace;
}
}
public static void main(String args) {
//FileLog fl=new FileLog;
//fl.setOutputStream(System.out);
//fl.error("error occours!逆势");
FileLog fl=new FileLog("c:/log.txt");
fl.error("error occours!逆势");
}
/**
* @return
*/
public String getLogFilePath {
return logFilePath;
}
/**
* @param string
*/
public void setLogFilePath(String string) {
logFilePath = string;
}
/**
* @return
*/
public java.io.OutputStream getOutputStream {
return outputStream;
}
/**
* @param stream
*/
public void setOutputStream(java.io.OutputStream stream) {
outputStream = stream;
}
}
查看评论 回复