Можно ли с помощью Java удалить в корзину?

StackOverflow https://stackoverflow.com/questions/222463

  •  03-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

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

Другие советы

Десять лет спустя, с 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).

В 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);
    }

}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top