[RESOLVIDO] Problema com File no Windows

Eu estou tentado apagar uma pasta e o que tem dentro dela mais não ta fucioanado alguem pode me ajuadar

private void RemoverActionPerformed(java.awt.event.ActionEvent evt) {                                        
    DefaultTableModel model=(DefaultTableModel)TabelaDeLivros.getModel();
    String SeleçãoDoLivro=TabelaDeLivros.getValueAt(TabelaDeLivros.getSelectedRow(),1).toString();
   model.removeRow(TabelaDeLivros.getSelectedRow());
   TabelaDeLivros.clearSelection();
   File file = null;
   //Windows 
   if("windows".equals(System.getProperty("sun.desktop"))){
   file=new File("C:/SistemaBibliotecario/Livros/"+SeleçãoDoLivro);
   }
   //Linux
   if("Linux".equals(System.getProperty("os.name"))){
   file=new File("/home/"+System.getProperty("user.name")+"/SistemaBibliotecario/Livros/"+SeleçãoDoLivro);
   }
    if (file.isDirectory()){
File[] sun = file.listFiles();
for (File toDelete : sun) {
	toDelete.delete();
    }
   }
    file.delete();

Ta ai o codigo

Tá dando erro? O que acontece?

1 curtida

Não esta apagando a pasta no Windwos so no Linux

Crie um método recursivo como esse:

void delTree(File file) {
    if (file.isDirectory()){
        File[] files = file.listFiles();
        for (File toDelete : files) {
            delTree(toDelete);
        }
    }
    file.delete();
}

Aí troque esse seu código aqui:

if (file.isDirectory()){
    File[] sun = file.listFiles();
    for (File toDelete : sun) {
        toDelete.delete();
    }
}
file.delete();

Por este aqui:

delTree(file);

vou testar

não funcionou

Como ficou seu código refatorado?
Posta aqui.

Parte do metodo

  void delTree(File file) {
if (file.isDirectory()){
    File[] files = file.listFiles();
    for (File toDelete : files) {
        delTree(toDelete);
    }
}
file.delete();

}
primeira parte onde o metodo ta separado

 DefaultTableModel model=(DefaultTableModel)TabelaDeLivros.getModel();
    String SeleçãoDoLivro=TabelaDeLivros.getValueAt(TabelaDeLivros.getSelectedRow(),1).toString();
   model.removeRow(TabelaDeLivros.getSelectedRow());
   TabelaDeLivros.clearSelection();
   File file = null;
   //Windows 
   if("windows".equals(System.getProperty("sun.desktop"))){
   file=new File("C:/SistemaBibliotecario/Livros/"+SeleçãoDoLivro);
   }
   //Linux
   if("Linux".equals(System.getProperty("os.name"))){
   file=new File("/home/"+System.getProperty("user.name")+"/SistemaBibliotecario/Livros/"+SeleçãoDoLivro);
   }
    delTree(file);

No Windows vc precisa colocar assim:

"C:\\SistemaBibliotecario\\Livros\\" + SelecaoDoLivro.

Tira essas pontuações das suas variáveis. Isso pode dar problemas pra vc

ja fiz isso e nao deu certo tbm

Tem certeza de que não há nenhum processo acessando os arquivos da pasta?
Não esqueceu nenhum InputStream ou OutputStream aberto?
O usuário que está executando o Java tem permissão para excluir arquivos?

ele tem permisão o caso do InputStream OutputStream eu nao sei

Esse windows que vc colocou é com o W minúsculo mesmo?

o if nao tem erro o erro ta no File pelo oq eu tava procurando um dos caras desse forum disse que o windows nao apaga se apasta estiver aberta mais como eu vou fechar a pastar

A IDE não pediu pra criar o try catch? Sempre que se usa a classe File ele pede, por causa da IOException. E se não tá excluindo, tá gerando algum erro…

Realmente, o Windows não deixa você apagar um diretório se ele estiver aberto no Windows Explorer.
Nesses casos nem acontece IOException, o que acontece é que o método delete() retorna false.
Talvez você precise pôr algum tipo de controle e avisar o usuário de que a pasta está em uso e não pode ser apagada.
Algo mais ou menos assim:

void delTree(File file) {
    if (file.isDirectory()){
        File[] files = file.listFiles();
        for (File toDelete : files) {
            delTree(toDelete);
        }
    }
    while (!file.delete()) {
        Component parentComponent = null;
        Object message = "Não foi possível apagar \"" + file.getAbsolutePath() + "\" pois o mesmo está em uso!";
        String title = "Atenção";
        int messageType =  JOptionPane.WARNING_MESSAGE;
        JOptionPane.showMessageDialog(parentComponent, message, title, messageType);
    }
}
1 curtida

obrigado

1 curtida