Pergunta

Java é a chave aqui. Eu preciso ser capaz de apagar arquivos, mas os usuários esperam para ser capaz de "desfazer" da lixeira. Tanto quanto eu posso dizer isso não é possível. Alguém sabe de outra forma?

Foi útil?

Solução

Por várias razões o Windows não tem noção de uma pasta que simplesmente corresponde à Lixeira .

A maneira correta é usar JNI para invocar o SHFileOperation API do Windows, definindo o sinalizador FO_DELETE na estrutura SHFILEOPSTRUCT.

Outras dicas

anos Dez mais tarde, com o Java 9, finalmente, há uma maneira builtin para mover arquivos para o Lixo Bin

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

public boolean moveToTrash​(File file)

Move o arquivo especificado para o lixo.

Parâmetros:

arquivo - o arquivo

Returns:

retorna true se moveu com êxito o arquivo para o lixo.

A disponibilidade desse recurso para a plataforma subjacente pode ser testado com Desktop.isSupported​(Desktop.Action.MOVE_TO_TRASH).

Eu encontrei este RFE no local sóis: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id= 5080625

Isso me diz que não há uma maneira java nativa para fazer isso. e como @ John Topley só postou a única solução é uma chamada JNI.

Veja a href="https://jdic.dev.java.net/incubator/fileutil/index.html" rel="nofollow noreferrer"> fileutil projeto da incubadora Componentes de Integração Java desktop projeto):

Este projeto da incubadora é criado para hospedar essas funcionalidades utilitário de arquivo, a maioria dos quais são extensões para a classe java.io.File em J2SE. Há frequentes pedidos de desenvolvedores Java para tais características como:. enviar um arquivo para lixeira , verificando espaço livre em disco, o acesso a atributos de arquivo etc. aborda esse projeto tão APIs frequentemente solicitados

Note, isso deve funcionar não apenas no Windows, mas em outras plataformas (Linux, Mac OS X) também.

Como John Topley sugere, você deve fazer isso com uma operação nativa. No caso de você não quer sujar as mãos com algum JNI, você poderia usar uma biblioteca chamada Java Native Acesso para fazer as chamadas nativas.

Java 9 tem novo método, mas no meu caso eu estou restrito a Java 8. Eu encontrei Java Native Access Platform que tem hasTrash () e moveToTrash () método. Eu testei no Win 10 e Mac OS (Trabalhou) para mim.

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

Repositório Maven https://mvnrepository.com/artifact/net. java.dev.jna / ANJ-plataforma / 5.1.0

Não confunda É Java Native Access Platform não Java Native Acesso

As minhas 3 centavos - uso cmd util Recycle.exe com -f para forçar reciclagem (sem pronto). Funciona perfeitamente.

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

}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top