Можно ли с помощью Java удалить в корзину?
-
03-07-2019 - |
Вопрос
Джава здесь ключевое слово.Мне нужна возможность удалять файлы, но пользователи ожидают возможности «восстановить удаление» из корзины.Насколько я могу судить, это невозможно.Кто-нибудь знает иначе?
Решение
По разным причинам Windows не имеет понятия о папке, которая просто соответствует корзине.
Правильный способ — использовать JNI для вызова Windows. SHFileOperation
API, настройка FO_DELETE
флаг в SHFILEOPSTRUCT
состав.
- Документация SHFileOperation
- Пример Java для копирования файла с помощью SHFileOperation (ссылка на корзину в той же статье не работает)
Другие советы
Десять лет спустя, с Java & nbsp; 9, наконец-то появился встроенный способ перемещения файлов в корзину
java .awt.Desktop.moveToTrash (java.io.File) код>
:
public boolean moveToTrash & # 8203; (файл файла)
Перемещает указанный файл в корзину.
Параметры:
файл - файл
Возврат:
возвращает true, если файл успешно перемещен в корзину.
Доступность этой функции для базовой платформы можно проверить с помощью Desktop.isSupported & # 8203; (Desktop.Action.MOVE_TO_TRASH)
.
Я нашел этот RFE на сайте солнц: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id= 5080625 р>
Это говорит мне, что для этого не существует нативного Java-способа. и поскольку @John Topley только что опубликовал, единственное решение - это вызов JNI.
См. fileutil проект инкубатора (часть Компоненты интеграции с рабочим столом Java проект):
Этот проект инкубатора создан для размещения тех функциональных возможностей файловой утилиты, большинство из которых являются расширениями класса java.io.File в J2SE. Разработчики Java часто обращаются к таким функциям, как: отправка файла в корзину , проверка свободного места на диске, доступ к атрибутам файла и т. Д. В этом проекте рассматриваются такие часто запрашиваемые API.
Обратите внимание, это должно работать не только в Windows, но и на других платформах (Linux, Mac OS X).
Вот правильная ссылка на пример использования SHFileOperation для отправки файла в корзину а>. р>
Как предполагает Джон Топли, вы должны сделать это с помощью нативной операции. Если вы не хотите испачкать руки с помощью JNI, вы можете использовать библиотеку под названием Собственный доступ к Java делать родные звонки.
В Java 9 появился новый метод, но в моем случае я ограничен Java 8. Я нашел Платформу собственного доступа Java , в которой есть методы hasTrash () и moveToTrash () . Я протестировал его на Win 10 и Mac OS (работал) для меня.
static boolean moveToTrash(String filePath) {
File file = new File(filePath);
FileUtils fileUtils = FileUtils.getInstance();
if (fileUtils.hasTrash()) {
try {
fileUtils.moveToTrash(new File[] { file });
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
}
} else {
System.out.println("No Trash");
return false;
}
}
Репозиторий Maven https://mvnrepository.com/artifact/net. java.dev.jna / джна-платформы / 5.1.0
Не путайте, это Платформа собственного доступа Java , а не собственный доступ Java
Мои 3 цента - используйте утилиту cmd Recycle.exe с параметром -f для принудительной перезагрузки (нет незамедлительный). Работает отлично.
public class Trash {
public void moveToTrash(File ... file) throws IOException {
moveToTrash(false, file);
}
public void promptMoveToTrash(File ... file) throws IOException {
moveToTrash(true, file);
}
private void moveToTrash(boolean withPrompt, File ... file) throws IOException {
String fileList = Stream.of(file).map(File::getAbsolutePath).reduce((f1, f2)->f1+" "+f2).orElse("");
Runtime.getRuntime().exec("Recycle.exe "+(withPrompt ? "" : "-f ")+fileList);
}
}