现在有一个关于自动更新的需求:我们在一程序中下载更新文件到update文件中,要求将update中所有文件移动到父路径中,替换当前的所有文件,替换完毕后启动一个exe文件。
我们的更新迁移程序就是一个简单的jar包。
废话不多说上代码。
更新的代码CopyUtil.java
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
public class CopyUtil {
/**
* 移动指定文件或文件夹(包括所有文件和子文件夹)
*
* @param fromDir
* 要移动的文件或文件夹
* @param toDir
* 目标文件夹
* @throws Exception
*/
public static void MoveFolderAndFileWithSelf(String from, String to)
throws Exception {
try {
File dir = new File(from);
// 目标
// to =to+ File.separator + dir.getName();
File moveDir = new File(to);
if (dir.isDirectory()) {
if (!moveDir.exists()) {
moveDir.mkdirs();
}
} else {
File tofile = new File(to);
dir.renameTo(tofile);
return;
}
// 文件一览
File[] files = dir.listFiles();
if (files == null)
return;
// 文件移动
for (int i = 0; i < files.length; i++) {
System.out.println("文件名:" + files[i].getName());
if (files[i].isDirectory()) {
MoveFolderAndFileWithSelf(files[i].getPath(), to
+ File.separator + files[i].getName());
// 成功,删除原文件
files[i].delete();
}
File moveFile = new File(moveDir.getPath() + File.separator
+ files[i].getName());
// 目标文件夹下存在的话,删除
if (moveFile.exists()) {
moveFile.delete();
}
files[i].renameTo(moveFile);
}
} catch (Exception e) {
throw e;
}
}
public static void main(String[] args) throws Exception {
CopyUtil databean = new CopyUtil();
//获取当前jar的路径 如d:\workfile\update\update.jar
String path = CopyUtil.class.getProtectionDomain().getCodeSource()
.getLocation().getPath();
//获取当前jar所在的文件夹路径 如d:\workfile\update
File file_ = new File(path);
//更新文件存放目录
String from_path = file_.getParent() +File.separator+ "update";
//需要替换的文件存放目录
String to_path = file_.getParent();
//执行替换动作
databean.MoveFolderAndFileWithSelf(from_path, to_path);
//启动exe文件
String doUtils=file_.getParent()+File.separator+"ERP.exe";
try{
Runtime.getRuntime().exec("cmd /c "+doUtils);
}catch(Exception e){}
}
}
将程序打包成可运行的jar包,然后既可以通过bat脚本启动
工具包的文件如下:
直接执行bat文件会有cmd的褐色弹框出现,通过在vbs中调用bat脚本去掉褐色弹框。
具体jar文件打包运行可以参考我的另一篇文档