日期:2014-05-20  浏览次数:20767 次

请教一个java程序删除自身的问题
想实现这样的功能,程序自身运行完后删除自己这个EXE文件。
通过写一个BAT文件来删除,不知道哪出了问题,请教各位大牛指点迷津。
BAT文件是这样的内容:
:pp
del d:\TestRun.exe
if exist d:\TestRun.exe goto pp
del %0


java文件:
import java.io.*;
import java.io.IOException;

public class TestRun{



public static void main(String[] args){
FileWriter fw = null;
String batcode = ":pp\ndel d:\\TestRun.exe\nif exist d:\\TestRun.exe goto pp\ndel %0";

try{
fw = new FileWriter("d:/te.bat");
fw.write(batcode,0,batcode.length());
fw.close();
String cmd = "cmd.exe /c d:\\te.bat";
Runtime.getRuntime( ).exec( cmd );

}catch(IOException e){
e.printStackTrace();
System.out.println("文件写入错误");
System.exit(-1);
}

}
}

java文件编译后做成TestRun.exe,存在D盘根目录下。
功能实现不了,请各位指点迷津,这个测试程序该怎么写。

100分在线等。

------解决方案--------------------
要能删除这个exe,需要两个条件:
1、另一个独立进程(而非子进程)中执行删除命令;
2、exe程序结束(退出)。

尝试用 start 而非 cmd 命令来启动bat脚本吧。
------解决方案--------------------
have a try
Java code
public static void main(String[] args){
Runtime.getRuntime().addShutdownHook(new Thread() { //追加程序结束hook,也就是说程序结束时会调用这个hook处理
    public void run() {
        Runtime.getRuntime().exec("cmd d:/te.bat"); //在hook处理中调用bat删除程序
    }
}); 

//以下是LZ生成bat文件的代码
FileWriter fw = null;
String batcode = ":pp\ndel d:\\TestRun.exe\nif exist d:\\TestRun.exe goto pp\ndel %0";

try{
fw = new FileWriter("d:/te.bat");
fw.write(batcode,0,batcode.length());
fw.close();
String cmd = "cmd.exe /c d:\\te.bat";
Runtime.getRuntime( ).exec( cmd );

}catch(IOException e){
e.printStackTrace();
System.out.println("文件写入错误");
System.exit(-1);
}

}
}

------解决方案--------------------
奇怪,殺死自己的進程之後還可以繼續執行程序嗎(除非不是當前執行進程),addShutDownHook是在JVM生命期內調用的吧
還有class文件看來可以在程序執行時被刪除