Как открыть проводник Windows и выделить указанный файл с помощью Java?
Я сейчас использую Java Desktop API для работы с проводником файлов. Я знаю, как открыть проводник, но не знаю, как открыть его и выделить указанный файл.
Когда мы используем Chrome, после загрузки файлов мы можем выбрать "Показать в папке", чтобы открыть проводник и выделить загруженный файл.
Как можно сделать это с помощью Java Desktop API? Или есть другие API в Java, которые могут реализовать эту задачу?
5 ответ(ов)
Чтобы открыть проводник Windows и выделить файл по заданному пути, вы можете использовать следующий код на Java:
Runtime.getRuntime().exec("explorer.exe /select,\"" + path + "\"");
Этот способ также будет работать, если в path
есть пробелы. Убедитесь, что путь к файлу правильно экранирован, если он содержит специальные символы или пробелы, чтобы избежать ошибок при выполнении команды.
EDIT:
С начала Java 9 в API Desktop появился метод для выбора файла:
desktop.browseFileDirectory(<file>)
EDIT:
Вы не можете выделить конкретный файл с помощью API Desktop в Java.
ОТВЕТ НА ИСХОДНЫЙ ВОПРОС:
API Desktop позволяет вам сделать это с помощью следующего фрагмента кода:
File file = new File("c:\\<directory>");
Desktop desktop = Desktop.getDesktop();
desktop.open(file);
Документация по приведённому выше коду доступна по следующим ссылкам:
http://docs.oracle.com/javase/10/docs/api/java/awt/Desktop.html и
http://docs.oracle.com/javase/10/docs/api/java/io/File.html
На компьютере с Windows это откроет проводник по умолчанию, а на других системах - соответственно их аналогичные проводники.
В качестве альтернативы вы можете использовать новый API Path в Java для построения необходимого пути, а затем вызвать метод, который вернет соответствующий объект File.
Для краткости я опустил код проверки, чтобы убедиться, что объекты Desktop и File существуют.
Вы можете открыть определённый путь из командной строки с помощью следующей команды:
start C:/ProgramData
В Java есть два способа открыть проводник Windows с указанным путём:
Использовать класс
Process
(как упоминалось в предыдущих ответах), но с командойstart
:try { Process builder = Runtime.getRuntime().exec("cmd /c start C:/ProgramData"); } catch (IOException e) { e.printStackTrace(); }
Использовать класс
Desktop
:try { Desktop.getDesktop().open(new File("C:/ProgramData")); } catch (IOException e) { e.printStackTrace(); }
Оба способа позволят вам открыть указанный путь в проводнике Windows. Выберите тот, который больше подходит для вашего случая использования!
Этот код работает даже в случае, если название файла или папки содержит несколько пробелов между словами.
// В этом примере между "GAME" и "OF" три пробела, а между "OF" и "Thrones" два пробела
String onlyPath = "D:\\GAME OF Thrones";
String selectPath = "/select," + onlyPath;
// START: Удаляем лишние пробелы между последовательными пробелами
LinkedList<String> list = new LinkedList<>();
StringBuilder sb = new StringBuilder();
boolean flag = true;
for (int i = 0; i < selectPath.length(); i++) {
if (i == 0) {
sb.append(selectPath.charAt(i));
continue;
}
if (selectPath.charAt(i) == ' ' && flag) {
list.add(sb.toString());
sb.setLength(0);
flag = false;
continue;
}
if (!flag && selectPath.charAt(i) != ' ') {
flag = true;
}
sb.append(selectPath.charAt(i));
}
list.add(sb.toString());
list.addFirst("explorer.exe");
// END: Удаляем лишние пробелы между последовательными пробелами
// Вывод списка
for (String s : list) {
System.out.println("строка:" + s);
}
/* вывод вышеуказанного цикла
строка:explorer.exe
строка:/select,D:\GAME
строка: OF
строка: Thrones
*/
// Открывает в Проводнике и выделяет
Process p = new ProcessBuilder(list).start();
Таким образом, этот код эффективно справляется с ситуациями, когда имя файла или папки содержит несколько пробелов подряд, разбивая их на отдельные части и корректно передавая их в команду для запуска Проводника Windows.
Вот более короткая версия вышеуказанного кода:
String onlyPath = "D:\\GAME OF Thrones";
new ProcessBuilder("explorer.exe", "/select," + onlyPath).start();
Обратите внимание, что я напрямую передаю аргументы в ProcessBuilder
, что делает код более читаемым и избегает необходимости разбивать строку на части с помощью split()
.
Не удается запустить Eclipse - Java был запущен, но вернул код завершения = 13
Как преобразовать .jar в .exe?
Что значит 'synchronized'?
Как объявить массив в одну строку?
Какие проблемы следует учитывать при переопределении equals и hashCode в Java?