Создаем .bat файл, запускаем его и удаляем из Java

Я делаю .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();

person Maroun    schedule 28.02.2013    source источник
comment
Если вы хотите убедиться, что он будет удален после выполнения, вам следует дождаться завершения выполнения, а затем удалить его.   -  person RudolphEst    schedule 28.02.2013
comment
Если у вас есть доступ к файлам bat, вы можете сделать так, чтобы он удалить себя   -  person Default    schedule 28.02.2013


Ответы (3)


Я бы не стал удалять файл в другом потоке, что, если выполнение файла все еще выполняется в то время, когда вы пытаетесь его удалить?

Я бы подумал о том, чтобы запросить код выхода из файла или использовать process.waitFor(), который вызывает текущий поток для ожидания, если это необходимо, пока процесс, представленный этим объектом Process, не завершится.

Process p = Runtime.getRuntime().exec("cmd /c start a.bat");
p.waitFor();
file.delete();
person CloudyMarble    schedule 28.02.2013

Попробуйте это, что заставляет код ждать завершения выполнения пакетного файла перед удалением файла.

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

В идеале в это решение следует также встроить обработку ошибок, например поиск возврата 0 из метода waitFor().

person Chris Knight    schedule 28.02.2013

Нет, это нехороший подход. На самом деле я не вижу никакого преимущества в дополнительном потоке. Скорее всего, он попытается удалить файл, пока он еще используется cmd, и удалить его не удастся. Вместо этого вы должны использовать объект Process (результат exec()) и дождаться его завершения, а затем удалить файл:

Process p = Runtime.getRuntime().exec("cmd /c start a.bat");
p.waitFor();
file.delete()
person Adam Dyga    schedule 28.02.2013