2013-02-28 79 views
0

我在Java中动态制作.bat创建一个“.bat”文件,运行它并从Java中删除它

创建文件并执行后,我想删除它。

为了确保delete()将在运行.bat文件后执行,我在另一个线程中删除了该文件。

这是一个很好的方法来完成这项任务吗?你会如何更好地实施它?

final File file = new File("run.bat"); 
file.createNewFile(); 
PrintWriter writer = new PrintWriter(file, "UTF-8"); 
writer.println(COMMAND1); 
writer.println(COMMAND2); 

.... ANOTHER COMMANDS 

writer.close(); 
Runtime.getRuntime().exec("cmd /c start a.bat"); 

new Thread(new Runnable() { 
    public void run() { 
     file.delete(); 
    } 
}).run(); 
+0

如果你想确保它在执行后删除,您应该等待执行完成并删除它。 – RudolphEst 2013-02-28 13:42:26

+0

如果你有权访问bat文件,你可以使它[删除自己](http://stackoverflow.com/q/2888976/238902“如何使.BAT文件完成后自行删除它?”) – Default 2013-02-28 13:50:13

回答

5

我不会删除在不同的线程中的文件,如果在您尝试删除它时文件执行仍在运行,该怎么办?

我会考虑从文件中请求exit code,或者使用process.waitFor(),如果需要,可以使当前线程等待,直到此Process对象表示的进程终止。

Process p = Runtime.getRuntime().exec("cmd /c start a.bat"); 
p.waitFor(); 
file.delete(); 
+0

嗯,什么一个巧合,你的例子和我的完全一样... – 2013-07-24 11:30:04

2

试试这会导致代码等到批处理文件执行完成后再删除文件。

Process batchFileExecutionProcess = Runtime.getRuntime().exec("cmd /c start a.bat"); 
batchFileExecutionProcess.waitFor(); 
file.delete(); 

理想情况下,你会建立自己的错误处理这个解决方案,以及,如寻找从WAITFOR()方法返回0。

1

不,这不是一个好方法。其实我没有看到额外的线程的任何优势。它很可能会在cmd仍在使用它时尝试删除该文件,并且删除将失败。 相反,你应该使用Process对象(的exec()的结果),并等待,直到它完成,删除文件,然后:

Process p = Runtime.getRuntime().exec("cmd /c start a.bat"); 
p.waitFor(); 
file.delete() 
相关问题