Como pegar a posição de um arquivo para deletá-lo?

18 respostas
cyruzin

Bom dia caros amigos, estou com o seguinte problema: Na UI do software que estou desenvolvendo, tem JButtons que servem para deletar arquivos de uma pasta. Quando eu clico em cima de um deles para deletar um dos arquivos da pasta, ele vai de boa, mas só se for na ordem certa, quando eu deleto por exemplo o primeiro e depois o terceiro, o meu algoritmo perde a posição dos arquivos da pasta na hora de recarregar os JButtons no painel.

Acho que preciso criar uma Lista que adicione o caminho dos arquivos da pasta para poder deletá-los dinamicamente pra o software não se perder. Porém, não estou conseguindo casar o List com o File do Java. Alguma luz?

18 Respostas

Arthemus

Você já deve ter uma lista com cada referência dos arquivos, não tem?

Veja se esse trecho de código lhe ajuda:

Iterator<Arquivo> it = lista.iterator();
  while (it.hasNext()) {
    Arquivo arq = it.next();
    if (arq.getId() == arquivoASerDeletado.getId()) {
      it.remove();
    }
  }
cyruzin

Você já deve ter uma lista com cada referência dos arquivos, não tem?

É justamente isso que eu não estou conseguindo fazer. Eu consigo adicionar os arquivos na lista, mas não sei como pegar a posição deles na pasta para comparar com os da lista.

cyruzin

Fiz até aqui, só não sei como pegar o index da pasta para comparar :/

String path, t;
List<String> listaDinamica = new ArrayList<>();
        
//LISTANDO OS ARQUIVOS DO DIRETÓRIO
File caminho = new File(srcDiretorio);
File[] arqs = caminho.listFiles();
        
//ADICIONANDO OS ARQUIVOS LISTA NUMA LISTA
for (int x = 0; x < arqs.length - 1; x++) {
path = arqs[x].getAbsolutePath();
listaDinamica.add(path);
}
    
//PERCORRENDO A LISTA DOS ARQUIVOS
Iterator <String> it = listaDinamica.iterator();
while (it.hasNext()){
t = it.next();
System.out.println(t);
}

Saída:

C:\CaptureTmp\Gdc_000_.png
C:\CaptureTmp\Gdc_001_.png
C:\CaptureTmp\Gdc_002_.png

Arthemus

Talvez para comparação possa ser usado outro valor alem do index… vou montar um projeto aqui pra testa e já te respondo…

cyruzin

Beleza, valeu.

Arthemus

Como você ta escolhendo o arquivo a ser excluído? Tem uma tela com os arquivos listados?

cyruzin

Quando eu clico em remover, o painel recarrega os botões apenas com a quantidade de imagens que a pasta tem. Ex: 3 fotos = 3 jbuttons. Por isso que a lista é a melhor opção. Quando eu deleto um arquivo, ela se reorganiza antes de montar os botoes novamente.

E

Não li seu código nem analisei seu problema.

Mas como tive um problema semelhante uma vez ao remover elementos de uma lista pelos seus índices, que tal apagar os arquivos de trás para frente? (ou melhor dizendo, da maior posição para a menor?)
Isso não altera as posições.

Por exemplo, digamos que você tenha verificado que é necessário apagar os arquivos 0, 2 e 5 de uma lista de 10 elementos.

Se você apagar pela ordem (0, 2 e 5) vai ver que ao apagar o elemento 0, a posição do elemento 2 vai se alterar para 1, e então quando for apagar o novo elemento 1, a posição do elemento 5 vai se alterar para 3 (porque já tinha se alterado para 4 na hora que você removeu o elemento 0). Ou seja, ou você leva isso em conta,

Mas se você apagar o 5 primeiro, e depois o 2 e o 0, então vai ver que as posições não vão se alterar.

Arthemus

cyruzin, veja se esse exemplo pode te ajuda…

Nesse exemplo estou utilizando JToggleButton para identificar o botão que deve ser excluído, mas pode ser feita de outra forma conforme seu projeto.

Veja essa parte do código:

Component[] botoes = pnlBotoes.getComponents();

for (int iCount = 0; iCount &lt; botoes.length; iCount++) {
  JToggleButton btn = (JToggleButton) botoes[iCount];
  if (btn.isSelected()) {
    new File(btn.getText()).delete();
  }
}
cyruzin

Valeu, vou dar uma analisada no código aqui e depois te digo se deu certo. :slight_smile:

Arthemus

Di boa!

cyruzin

Olha o que eu fiz nesse projeto de teste para gerar uma ID e pegar o caminho:

Classe Controller:

package br.com.testes;

import java.io.File;
import java.util.HashMap;

public class Controller {

    //DECLARAÇÃO DE VARIÁVEIS
    private HashMap<Integer, String> mapaArquivos = new HashMap<>();
    private String path;
    private File arquivos;
    private File[] caminho;

    //MÉTODO PARA GERAR O ID E PEGAR O CAMINHO DO ARQUIVO NA PASTA ESPECIFICADA 
    public void mapearPasta(String dir) {

        this.arquivos = new File(dir);
        this.caminho = arquivos.listFiles();
        for (int i = 0; i < caminho.length; i++) {
            this.path = caminho[i].getAbsolutePath();
            this.mapaArquivos.put(new Integer(i), this.path);
        }
        //SAÍDA
        System.out.println("ID / Arquivo: " + this.mapaArquivos);
    }
}

Classe Principal:

package br.com.testes;

public class Principal {
    
    public static void main(String[] args) {

        Controller c = new Controller();
        c.mapearPasta("\\Temp/");
    }
}
Arthemus

Opa cyruzin, fiz um teste aqui com suas classes, fica legal, assim cada arquivo é guardado no map com um id especifico. Você conseguiu fazer o form funciona como queria, clicando no arquivo e excluindo ele?

cyruzin

Estou trabalhando em cima disso agora. Acho que já já eu consigo, ai posto aqui como eu fiz.

cyruzin

Mudei um pouco o método que fiz acima e criei um novo, basta agora só criar um evento para pegar o AbsolutePath do arquivo para passar no parâmetro ao invés de passar um caminho estático. :D

Classe Controller:

package br.com.testes;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class Controller {

    //DECLARAÇÃO DE VARIÁVEIS
    private List<String> listaArquivos = new ArrayList<>();

    //MÉTODO PARA GERAR O ID E PEGAR O CAMINHO DO ARQUIVO NA PASTA ESPECIFICADA 
    public void listarArquivos(String dir) {
        File[] caminho;
        String path;
        File arquivos;
        
        arquivos = new File(dir);
        caminho = arquivos.listFiles();
        for (int i = 0; i < caminho.length; i++) {
            path = caminho[i].getAbsolutePath();
            this.listaArquivos.add(path);

        }
        System.out.println("Arquivos: " + this.listaArquivos);
    }
 //MÉTODO PARA DELETAR O ARQUIVO DO DISCO E REMOVÊ-LO DA LISTA
    public void removerArquivo(String nome) {

        File f = new File(nome);
        nome = f.getAbsolutePath();
        f.delete();
        this.listaArquivos.remove(this.listaArquivos.indexOf(nome));
        System.out.println("Arquivos: " + this.listaArquivos);

    }
}

Classe Principal:

package br.com.testes;

public class Principal {
    
    public static void main(String[] args) {

        Controller c = new Controller();
        c.listarArquivos("\\Temp/");
        c.removerArquivo("\\Temp/Gdc_000_.png");
    }
}
Arthemus

Ai sim hen ;] agora é só trabalha em uma tela, usando Swing por exemplo… da pra usar o JTree, e lista os arquivos e pastas do diretório, pode fica legal.

cyruzin

É mesmo! Tinha nem percebido esse lance do JTree que por sinal é o próximo passo do projeto. :smiley:

PS: Valeu pela ajuda cara. 8)

Arthemus

Opa, tamos ai ;]

Criado 27 de junho de 2012
Ultima resposta 28 de jun. de 2012
Respostas 18
Participantes 3