Java - это ключ. Мне нужно иметь возможность удалять файлы, но пользователи ожидают, что смогут "восстановить" из корзины. Насколько я могу судить, это невозможно. Кто-нибудь знает иначе?
Возможно ли, чтобы Java удалялась в Корзину?
Ответ 1
По разным причинам Windows не имеет понятия папки, которая просто соответствует корзине.
Правильный способ - использовать JNI для вызова API Windows SHFileOperation
, устанавливая флаг FO_DELETE
в структуре SHFILEOPSTRUCT
.
- Документация SHFileOperation
- Пример Java для копирования файла с использованием SHFileOperation (ссылка в корзине в той же статье не работает)
Ответ 2
Десять лет спустя, с Java 9, наконец-то появился встроенный способ перемещения файлов в корзину.
java.awt.Desktop.moveToTrash(java.io.File)
:
public boolean moveToTrash(File file)
Перемещает указанный файл в корзину.
Параметры:
файл - файл
Возвращает:
возвращает true, если файл успешно перемещен в корзину.
Доступность этой функции для базовой платформы можно проверить с помощью Desktop.isSupported(Desktop.Action.MOVE_TO_TRASH)
.
Ответ 3
Я нашел это RFE на сайте suns: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5080625
Это говорит мне, что для этого не существует собственного способа Java. и как @John Topley только что отправил единственное решение - вызов JNI.
Ответ 4
Смотрите проект fileutil инкубатора (часть Java Desktop Integration Components):
Этот проект инкубатора создан для размещения этих функциональных возможностей файловой утилиты, большинство из которых являются расширениями класса java.io.File в J2SE. Частые запросы от разработчиков Java для таких функций, как: отправка файла в корзину мусора, проверка свободного места на диске, доступ к атрибутам файла и т.д. В этом проекте рассматриваются такие часто запрашиваемые API.
Обратите внимание: это должно работать не только на Windows, но и на других платформах (Linux, Mac OS X).
Ответ 5
Здесь правильная ссылка на пример использования SHFileOperation для отправки файла в корзину.
Ответ 6
Как говорит Джон Толли, вы должны сделать это с помощью собственной операции. Если вы не хотите, чтобы ваши руки были грязными с некоторыми JNI, вы могли бы использовать библиотеку под названием Java Native Access для выполнения собственных вызовов.
Ответ 7
В Java 9 появился новый метод, но в моем случае я ограничен Java 8. Я нашел платформу Java Native Access Platform, в которой есть методы 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/jna-platform/5.1.0
Не путайте, это Платформа Собственного Доступа Java, а не Собственный Доступ Java
Ответ 8
Мои 3 цента - используйте cmd util 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);
}
}
Ответ 9
Да, я рекомендую использовать JNA
для Java 8
и ниже:
import com.sun.jna.platform.FileUtils;
import java.io.File;
import java.io.IOException;
import static java.nio.file.Files.delete;
public class Trash
{
public static void moveToTrash(File... files) throws IOException
{
FileUtils fileUtils = FileUtils.getInstance();
if (fileUtils.hasTrash())
{
fileUtils.moveToTrash(files);
} else
{
for (File file : files)
{
delete(file.toPath());
}
}
}
}
На основании этого ответа.
Ответ 10
На платформе JNA FileUtils
не использует Win32 API. Вы должны предпочесть W32FileUtils
который поддерживает Undo (восстановить файл из корзины).