增量更新项目时的备份MyBak

在增量更新项目时,做好备份十分重要,这里提供一个方法备份java Web所更新的文件。

把更新包放在指定目录,配好如下webappFolder、updateFolder以及bakeupFolder的路径。

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
import java.text.SimpleDateFormat;
import java.util.Date;
  
public class MyBak
{
  private static StringBuffer globalTxtMessage = new StringBuffer("");
  private static StringBuffer stdoutMessage = new StringBuffer("");
  private static int totalFileNumber = 0;
  private static int totalSuccessCopyNumber = 0;
  private static int totalNewFileNumber = 0;
  
  public static void main(String[] args)
  {
    String today = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
  
    String webappFolder = "/www/htdocs/webapps/M4";
  
    String updateFolder = "/home/whaty/bakeForUpdate/update/" + today;
  
    String backupFolder = "/home/whaty/bakeForUpdate/bake/" + today;
  
    if (webappFolder.equals(backupFolder)) {
      stdoutMessage.append("you can't just copy thins to the webapps folder!\n");
      globalTxtMessage = new StringBuffer("");
      stdoutMessage = new StringBuffer("");
    } else {
      String msg = backupFiles(updateFolder, webappFolder, backupFolder);
      System.out.print(msg);
      globalTxtMessage = new StringBuffer("");
      stdoutMessage = new StringBuffer("");
    }
  }
  
  public static String backupFiles(String _updateFolder, String _webappFolder, String _backupFolder)
  {
    String today = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
    String now = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date());
    try {
      File updateFolder = new File(_updateFolder);
      File webappFolder = new File(_webappFolder);
      File backupFolder = new File(_backupFolder);
  
      globalTxtMessage.append("============" + now + "Backup Log==========\n");
      globalTxtMessage.append("============初始化条件测试开始===============\n");
      stdoutMessage.append("============init test start===============\n");
  
      if (!(updateFolder.exists())) {
        globalTxtMessage.append(_updateFolder + "更新包文件夹找不到!\n");
        stdoutMessage.append(" the upload folder \"" + _updateFolder + "\" can Not found! \n please make sure you have upload the folder!!!!\n");
      }
      if (!(webappFolder.exists())) {
        globalTxtMessage.append("项目Webapp文件夹" + _webappFolder + "找不到!\n");
        stdoutMessage.append("the Webapp folder " + _webappFolder + " can Not found!!!\n please make sure the folder is exists!!!!\n");
        return stdoutMessage.toString();
      }
      if (!(backupFolder.exists())) {
        globalTxtMessage.append("自动创建备份文件夹" + backupFolder.getAbsolutePath() + "\n");
        stdoutMessage.append("auto create folder " + backupFolder.getAbsolutePath() + "\n");
        backupFolder.mkdirs();
      }
      globalTxtMessage.append("============初始化条件测试结束===============\n");
      stdoutMessage.append("============init  test end===============\n");
  
      Long start = Long.valueOf(System.currentTimeMillis());
  
      copyFilesToDirectory(updateFolder, webappFolder, backupFolder);
  
      Long end = Long.valueOf(System.currentTimeMillis());
  
      Long oprationMillisTime = Long.valueOf(end.longValue() - start.longValue());
      Long oprationSecondTime = Long.valueOf((end.longValue() - start.longValue()) / 1000L);
  
      globalTxtMessage.append("备份完成!\n");
      globalTxtMessage.append("=========================================\n");
      globalTxtMessage.append("总文件数:" + totalFileNumber + "\n");
      globalTxtMessage.append("成功复制:" + totalSuccessCopyNumber + "\n");
      globalTxtMessage.append("新增文件数:" + totalNewFileNumber + "\n");
      globalTxtMessage.append("拷贝文件所需时间[oprationMillisTime]:" + oprationMillisTime + " 毫秒\n");
      globalTxtMessage.append("拷贝文件所需时间[oprationSecondTime]:" + oprationSecondTime + " 秒\n");
  
      stdoutMessage.append("backup done!\n");
      stdoutMessage.append("total files number:" + totalFileNumber + "\n");
      stdoutMessage.append("success copies number:" + totalSuccessCopyNumber + "\n");
      stdoutMessage.append("new files number:" + totalNewFileNumber + "\n");
      stdoutMessage.append("copy files time[oprationMillisTime]:" + oprationMillisTime + " MillisTime...\n");
      stdoutMessage.append("copy files time[oprationSecondTime]:" + oprationSecondTime + " sencends...\n");
      stdoutMessage.append("check more info in this file:" + _backupFolder + "/" + today + "_bak" + "/backupLog.txt\n");
      File logFile=new File(_backupFolder + "/backupLog.txt");
      logFile.createNewFile();
      FileWriter fw = new FileWriter(logFile);
      BufferedWriter bw = new BufferedWriter(fw);
      bw.write(globalTxtMessage.toString());
      bw.flush();
      bw.close();
    }
    catch (Exception e)
    {
      globalTxtMessage.append("============The main function Exception...==============\n");
      e.printStackTrace();
    }
    return stdoutMessage.toString();
  }
  
  public static void copyFilesToDirectory(File _updateFolder, File _webappFolder, File _backupFolder) {
    String today = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
    try {
      if (!(_updateFolder.isDirectory())) {
        File srcFile = new File(_webappFolder.getAbsolutePath() + _updateFolder.getPath().split(today)[1]);
        System.out.println(_webappFolder.getAbsolutePath() + _updateFolder.getPath().split(today)[1]);
        totalFileNumber += 1;
        if (!(srcFile.exists())) {
          totalNewFileNumber += 1;
          globalTxtMessage.append("文件:" + srcFile.getPath() + " 在原webapp文件文件夹中不存在,请确认这是个新添加的文件 \n"); return;
        }
        File destFile = new File(_backupFolder.getAbsolutePath() + _updateFolder.getPath().split(today)[1]);
        copyFile(srcFile.getAbsolutePath(), destFile.getAbsolutePath());
        totalSuccessCopyNumber += 1; return;
      }
  
      File[] files = _updateFolder.listFiles();
      for (int i = 0; i < files.length; ++i)
      {
        copyFilesToDirectory(files[i], _webappFolder, _backupFolder);
      }
    }
    catch (Exception e) {
      globalTxtMessage.append("复制文件出错! \n");
      e.printStackTrace();
    }
  }
  
  public static void copyFile(String oldPath, String newPath)
  {
    int bytesum = 0;
    int byteread = 0;
    File oldfile = new File(oldPath);
    File newfile = new File(newPath);
  
    if (!(newfile.getParentFile().exists())) {
      newfile.getParentFile().mkdirs();
    }
  
    if (oldfile.exists()) {
      InputStream inStream = null;
      FileOutputStream fs = null;
      try {
        inStream = new FileInputStream(oldPath);
        fs = new FileOutputStream(newPath);
  
        byte[] buffer = new byte[1444];
        while ((byteread = inStream.read(buffer)) != -1) {
          bytesum += byteread;
          fs.write(buffer, 0, byteread);
        }
      }catch (FileNotFoundException e) {
        globalTxtMessage.append("复制文件:" + oldfile.getName() + " 时找不到文件! \n");
        e.printStackTrace();
      }catch (IOException e){
        globalTxtMessage.append("复制文件:" + oldfile.getName() + " 时出错! \n");
        e.printStackTrace();
      } finally {
        try {
          if (inStream != null)
            inStream.close();
  
          if (fs != null)
            fs.close();
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
      globalTxtMessage.append("文件复制成功:" + oldfile.getAbsolutePath() + "(size:" + (bytesum / 1024.0D) + "KB)\n");
  
      Long oldFileLastModifiedTime = Long.valueOf(oldfile.lastModified());
      newfile.setLastModified(oldFileLastModifiedTime.longValue());
    } else {
      globalTxtMessage.append("文件:" + oldfile.getAbsolutePath() + " 找不到!\n");
    }
  }
}

运行javac MyBak.java,java MyBak。

这时程序会从旧有项目拷贝一份和更新包相同的文件到bakeupFolder目录。

最后,我们就可以大胆的把更新包在项目中覆盖老文件了。

posted @ 2015-06-26 09:58  豆苗稀  阅读(302)  评论(0编辑  收藏  举报