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