安装程序的工作:将源文件复制到相应的目录。
升级程序的工作:将源文件中更新过的文件覆盖目的文件,增加的文件复制到相应的目录。
卸载程序的工作:将程序文件夹的内容删除。
针对以上内容,写一个简单的安装程序
(主要文件: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;i<fs.length;i++){
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;i<fs.length;i++){
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;i<fs.length;i++){
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;
}
}