Можно ли с помощью Java удалить в корзину? - PullRequest
29 голосов
/ 21 октября 2008

Java является ключом здесь. Мне нужно иметь возможность удалять файлы, но пользователи ожидают, что смогут "удалить" из корзины Насколько я могу сказать, это невозможно. Кто-нибудь знает иначе?

Ответы [ 8 ]

25 голосов
/ 21 октября 2008

По разным причинам в Windows отсутствует концепция папки, которая просто соответствует корзине .

Правильный способ - использовать JNI для вызова Windows SHFileOperation API, устанавливая флаг FO_DELETE в структуре SHFILEOPSTRUCT.

11 голосов
/ 16 января 2018

Десять лет спустя, с Java 9, наконец-то появился встроенный способ перемещения файлов в корзину

java.awt.Desktop.moveToTrash(java.io.File):

public boolean moveToTrash​(File file)

Перемещает указанный файл в корзину.

Параметры:

файл - файл

Возвращает:

возвращает true, если файл успешно перемещен в корзину.

Доступность этой функции для базовой платформы можно проверить с помощью Desktop.isSupported​(Desktop.Action.MOVE_TO_TRASH).

2 голосов
/ 26 ноября 2009
2 голосов
/ 30 сентября 2009

См. Проект инкубатора fileutil (часть проекта Компоненты интеграции рабочего стола Java ):

Этот проект инкубатора создан для размещения тех функциональных возможностей файловой утилиты, большинство из которых являются расширениями класса java.io.File в J2SE. Разработчики Java часто запрашивают такие функции, как: отправка файла в мусорное ведро , проверка свободного места на диске, доступ к атрибутам файла и т. Д. В этом проекте рассматриваются такие часто запрашиваемые API.

Обратите внимание, это должно работать не только в Windows, но и на других платформах (Linux, Mac OS X).

2 голосов
/ 21 октября 2008

Я нашел этот RFE на сайте солнц: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5080625

Это говорит о том, что для этого не существует нативного Java-способа. и поскольку @John Topley только что опубликовал, единственное решение - это вызов JNI.

1 голос
/ 20 ноября 2018

В 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/jna-platform/5.1.0

Не путайте Это Платформа собственного доступа Java не собственный доступ Java

1 голос
/ 21 октября 2008

Как предполагает Джон Топли, вы должны сделать это с помощью нативной операции. Если вы не хотите пачкать руки каким-то JNI, вы можете использовать библиотеку с именем Собственный доступ к Java для выполнения собственных вызовов.

0 голосов
/ 24 июня 2017

Мои 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);
    }

}
...