Как работает USB Disk Ejector?

У меня есть приложение Java, предназначенное для работы на съемных дисках. Я хотел бы добавить кнопку, позволяющую пользователю безопасно удалить диск, на котором работает программа, как USB-диск. Эжектор позволяет. Однако я не уверен, как этого добиться (с точки зрения кода), поскольку диск нельзя извлечь, если с него запущена программа. Я знаю, что эта программа с открытым исходным кодом, но я не знаю, где найти код, который мне нужен, и он написан не на том языке, который я выучил.

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

заранее спасибо


person Andy    schedule 12.10.2013    source источник


Ответы (2)


Насколько мне известно, это невозможно реализовать на чистой Java, поскольку такие операции, как извлечение/размонтирование дисков, зависят от операционной системы и не включены в библиотеку Java по умолчанию, которая обычно поддерживает только наименьший общий знаменатель. Вам необходимо выполнить некоторый специфичный для платформы код, либо выполнив скрипт/пакетный файл, либо запустив собственный код, написанный, например. в C с использованием механизма Java JNI.

person Michał Kosmulski    schedule 12.10.2013
comment
У меня есть исполняемый файл, который позволяет мне безопасно удалить диск через командную строку, которую я планировал запустить из временного файла. Однако проблема в том, что я не знаю, как запустить исполняемый файл, поскольку диск нельзя извлечь, пока с него работают приложения. Мне нужно каким-то образом запустить скрипт, который ожидает выхода основного приложения, а затем пытается безопасно извлечь диск, но (с точки зрения кода) я на самом деле не уверен, как это сделать - person Andy; 13.10.2013

Вы правы, вам нужно будет запустить приложение с другого диска. Я бы следовал Установка компакт-диска Java Web Start руководство, которое должно работать так же хорошо для USB-накопителя или любого другого носителя, как и для компакт-дисков.

Вам нужно будет сделать ваше приложение приложением Java Web Start. На самом деле это намного проще, чем кажется; ваш .jar не нужно менять, вы просто создаете небольшой файл XML с расширением .jnlp и размещаете его рядом с файлом .jar. Информацию о файлах Java Web Start и JNLP можно найти в руководстве и в ссылки внизу этой страницы.

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

Path safeRemovalProgram = Files.createTempFile(null, ".exe");
try (InputStream stream =
        MyApp.class.getResourceAsStream("saferemoval.exe")) {
    Files.copy(stream, safeRemovalProgram,
        StandardCopyOption.REPLACE_EXISTING);
}
safeRemovalProgram.toFile().setExecutable(true);

ProcessBuilder builder =
    new ProcessBuilder(safeRemovalProgram.toString());
builder.redirectOutput(ProcessBuilder.Redirect.INHERIT);
Process safeRemovalProcess = builder.start();
person VGR    schedule 12.10.2013
comment
Спасибо за ваш ответ. Я понимаю эту концепцию и думаю, что она может работать, однако я думаю, что Web Start поставит под угрозу образ и переносимость моего приложения, поскольку я хотел бы, чтобы оно было упаковано как exe и запускалось со съемного диска. Я предполагаю, что при использовании Web Start ничего не запускается с диска? - person Andy; 13.10.2013
comment
Ссылка для установки с компакт-диска описывает, как создать файл install.bat (или setup.bat и т. д.). Я полагаю, вы могли бы даже заставить его работать с автозапуском, если хотите. Но я признаю, что у него не было бы такой же простоты использования, как у одного исполняемого файла, на который можно щелкнуть. Web Start обычно (всегда?) кэширует приложение, но я не знаю, будет ли он продолжать держать исходный неимпортированный файл .jar заблокированным в Windows. - person VGR; 13.10.2013