Как открыть предпочтительный редактор системы пользователей для данного файла?
Я пытаюсь выяснить, как открыть системный предпочтительный редактор для данного файла.
Скажем, у нас есть файловый менеджер, написанный на Java. Пользователь переходит в папку и видит список файлов. И, например, есть файл Icon.jpg
. Пользователь дважды нажимает на имя файла и файл открывается в системном предпочтительном редакторе (т.е. Gimp). Основная проблема - как это сделать?
Мы можем сделать Runtime.getRuntime().exec("something file")
, но таким образом вы должны знать, какая программа предпочтительна в пользовательской среде. Но как?
Мы также можем сделать Desktop.getDesktop().edit(File file)
, но таким образом мы не можем отслеживать процесс и не можем знать, что этот дочерний процесс закрыт. Другая проблема - функция не работает на linux (по крайней мере, на Ubuntu 8.10). Существует также Desktop.getDesktop().open(File file)
, но он заставляет открыть просмотрщик файлов, а не системный просмотрщик для этого типа файла.
Я ищу решение на всю неделю, но не получил подходящего и общего. Знаете ли вы другие подходы к этому вопросу? Для моего проекта было бы достаточно, если бы он работал на Windows + Linux + Mac.
Спасибо за ваши ответы и советы.
Редактировать 2009-02-08 23:04
Другое предложение: могу ли я заставить окно выбора приложения в Windows и Linux, как в Mac с "открытым файлом"? Например, тогда вы пытаетесь открыть файл, вас попросят выбрать приложение из списка предпочтительных систем? (что-то вроде "Открыть с..." в проводнике Windows). Знаете ли вы?
Ответы
Ответ 1
Кажется, что если вы не можете использовать java.awt.Desktop
, вам нужно различать ОС:
Окна:
RUNDLL32.EXE SHELL32.DLL,OpenAs_RunDLL <file.ext>
Linux:
edit <file.ext>
Mac:
open <file.ext>
НТН. Очевидно, что это не очень портативно...
Ответ 2
Проверьте объект java.awt.Desktop. В вашем случае вы хотите вызвать edit()
Если вы хотите, чтобы данная платформа поддерживала этот вызов, вы можете сделать что-то вроде следующего (я не тестировал этот код):
public boolean editFile(final File file) {
if (!Desktop.isDesktopSupported()) {
return false;
}
Desktop desktop = Desktop.getDesktop();
if (!desktop.isSupported(Desktop.Action.EDIT)) {
return false;
}
try {
desktop.edit(file);
} catch (IOException e) {
// Log an error
return false;
}
return true;
}
Ответ 3
Это не кросс-платформенный, но в Mac OS X вы можете сделать
Runtime.getRuntime().exec("open filename");
Исполняемый open(1)
использует LaunchServices, чтобы выбрать нужную программу для выполнения, а затем использует ее для открытия файла с именем filename
.
Ответ 4
Это будет работать в windows
Runtime.getRuntime().exec( "CMD /C START filename.ext " );