Abrir Diretório Pastas no Java

32 respostas Resolvido
java
R

Olá Galera estou tendo dificuldades em um negocio que estou fazendo em java.

eu tenho 3 pastas no meu diretório D:// com nomes diferentes e nessas 3 pastas exemplo teste1, teste2, teste3, no caso ficaria assim

D://teste1

D://teste2

D://teste3

e a função que eu quero fazer é a seguinte após a pessoa digitar o cpf do cliente na jTextField e clicar em procurar ele vai procurar nessa 3 pastas se tem essa pasta com mesmo número de cpf e se tiver ele vai abrir o diretório da pasta

eu tenho um jTextField e um botão “Procurar” na JFrame

já tentei usar o seguinte comando até que funciona só que no caso fica somente 1 pasta e preciso que faça a busca nas 3 pastas pra ver se tem, alguém poderia me ajudar?

Runtime.getRuntime() .exec(“explorer D:\teste1” + txtCPF.getText());

32 Respostas

R

Não é mais facil deixar o CPF em um database e o nome da pasta junto desse cadastro?

Exemplo:

NOME   |    CPF     |      PASTA
------------------------------------
Fulano | 12345678-4 |    D:\\teste1

E pra abrir a pasta:

Desktop.getDesktop().open(new File("D:\\teste1"));
R

Não entendi muito bem sua lógica poderia me explicar um pouco melhor, porque eu tenho mais de 50 mil pastas renomeadas com o cpf de cliente e cada pasta tem um produto especificado diferente que contem arquivos dos clientes dentro entendeu?

essa forma até funciona ele busca em todas pastas porém abre 3 pastas e queria que abrisse só a que fosse encontrada não sei se teria alguma forma de fazer isso

Runtime.getRuntime() .exec(explorer D:\produto1-clientes + txtCPF.getText());

Runtime.getRuntime() .exec(explorer D:\produto2-clientes + txtCPF.getText());

Runtime.getRuntime() .exec(explorer D:\produto3-clientes + txtCPF.getText());

testei sua função dessa forma

Desktop.getDesktop().open(new File("D:\\produto1-clientes"));
Desktop.getDesktop().open(new File("D:\\produto2-clientes"));
Desktop.getDesktop().open(new File("D:\\produto3-clientes"));

até que funciono mais ele só procura na primeira pasta se testar coloca um cpf da segunda pasta não executa

R

Eu que não to entendendo bem o que vc quer dizer, vamos lá:

Você quer saber se a pasta existe ou não? É isso?

pq nao executa? da erro?

R

bora lá, é o seguinte vamos supor que é uma borracharia ou oficina sei lá kkk, eu tenho 3 pastas assim renomeadas

  1. RODA
  2. FREIO
  3. PARA CHOQUE

e dentro dessas 3 pastas eu tenho subpastas criadas com com cpf do cliente em cada um com um serviço feito.
Exemplo:

PASTA RODA - 1
[telefone removido]
[telefone removido]

PASTA FREIO - 2
[telefone removido]
[telefone removido]

PASTA PARA CHOQUE - 3
[telefone removido]
[telefone removido]

então quando eu digitar um cpf lá no meu jTextField ele vai procurar o cpf que coloquei lá e vai procurar nessas 3 pastas e abrir ela se tiver entendeu?

as funções que fiz acima funciono mais não como eu quero preciso adaptar elas de alguma forma

R

Vai no diretório, imprime o nome de todas as pastas e verifica se tem a pasta que vc quer.

Se achar, abre a pasta.
Senão, vida que segue:

File file = new File("C:\\Users\\Abner\\NodeProjects\\Whatsapp\\git\\WhatsappServer");
        String[] pastas = file.list((File current, String name) -> new File(current, name).isDirectory());

        for (String nomes : pastas) {
            System.out.println(nomes);
            
            if(nomes.equals("node_modules")){
                System.out.println("tem node_modules :D, abrindo pasta...");
            }
        }
S

Vê se essa classe te ajuda:

import java.awt.Desktop;
import java.io.File;

public class AbridorDePastas {

    private String pastaRaiz;

    public AbridorDePastas(String pastaRaiz) {
        this.pastaRaiz = pastaRaiz;
    }

    public void abrir(String pastaParaAbrir) {
        procurarAbrir(new File(pastaRaiz), pastaParaAbrir);
    }

    private void procurarAbrir(File pastaAtual, String pastaParaAbrir) {
        File[] pastasFilhas = pastaAtual.listFiles(file -> file.isDirectory());
        for (File pastaFilha : pastasFilhas) {
            if (pastaFilha.getName().equals(pastaParaAbrir)) {
                try {
                    Desktop.getDesktop().open(pastaFilha);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            } else {
                procurarAbrir(pastaFilha, pastaParaAbrir);
            }
        }
    }
}

Exemplo de uso:

AbridorDePastas abridor = new AbridorDePastas("D:");
abridor.abrir("[telefone removido]");
R

no caso eu coloco meu diretório aonde das pasta? ou tenho que manter o arquivo jar dentro do diretório pra ele fazer a busca?

R

orochi tentei aqui mais não entendi muito bem como funciona ele até trouxe os nome da pasta pelo System.out.print porém não abriu

R

Pelo system out não vai abrir, usa o primeiro código que te passei.

Mas o código do staroski tá mais completo.

S

Não entendi o que você quis perguntar.

Você nos disse o seguinte:

eu tenho 3 pastas no meu diretório D:// com nomes diferentes e nessas 3 pastas exemplo teste1, teste2, teste3, no caso ficaria assim

a função que eu quero fazer é a seguinte após a pessoa digitar o cpf do cliente na jTextField e clicar em procurar ele vai procurar nessa 3 pastas se tem essa pasta com mesmo número de cpf e se tiver ele vai abrir o diretório da pasta

já tentei usar o seguinte comando até que funciona só que no caso fica somente 1 pasta e preciso que faça a busca nas 3 pastas pra ver se tem, alguém poderia me ajudar?

Pois bem, ao invés de fazer isso:

Runtime.getRuntime().exec("explorer D:\\teste1\\" + txtCPF.getText());

Você vai fazer isso:

new AbridorDePastas("D:").abrir(txtCPF.getText());

Você não vai informar as pastas teste1, teste2 e teste3 pro AbridorDePastas.
Basta informar a pasta raíz, no seu exemplo, o D:.
Ele já é esperto o bastante pra ir procurando recursivamente as pastas com o CPF informado.
:wink:

R

aah sim entendi gostei desse modo porém ainda não obtive sucesso coloquei assim mais não está abrindo

AbridorDePastas abridor = new AbridorDePastas(“D:\”);
abridor.abrir(txtCPF.getText());

S

Da uma depurada no código pra ver o que está acontecendo.

Provavelmente não tem nenhuma pasta ou subpasta cujo nome seja igual ao conteúdo do seu JTextField.

S

Essa instrução nem compila, tira essa \ do D:.

R

já tentei utilizar sem a \ e já tentei com duas \ e nada

R

Aqui funcionou

ezgif-3-23e4608cb739

public static void main(String[] args) {
    AbridorDePastas abridor = new AbridorDePastas("C:\\Users\\Abner\\NodeProjects\\Whatsapp\\git\\WhatsappServer"); //diretório
    abridor.abrir("input"); //pasta que eu quero que abra
}
R

Ué o meu está apresentando esses erro ao executar

Exception in thread AWT-EventQueue-0 java.lang.NullPointerException

at sistemadocs.AbridorDePastas.procurarAbrir(AbridorDePastas.java:19)

at sistemadocs.AbridorDePastas.procurarAbrir(AbridorDePastas.java:27)

at sistemadocs.AbridorDePastas.procurarAbrir(AbridorDePastas.java:27)

at sistemadocs.AbridorDePastas.abrir(AbridorDePastas.java:14)

at sistemadocs.SistemaDocumentos$5.actionPerformed(SistemaDocumentos.java:128)

at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)

at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)

at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)

at javax.swing.JToggleButton$ToggleButtonModel.setPressed(Unknown Source)

at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)

at java.awt.Component.processMouseEvent(Unknown Source)

at javax.swing.JComponent.processMouseEvent(Unknown Source)

at java.awt.Component.processEvent(Unknown Source)

at java.awt.Container.processEvent(Unknown Source)

at java.awt.Component.dispatchEventImpl(Unknown Source)

at java.awt.Container.dispatchEventImpl(Unknown Source)

at java.awt.Component.dispatchEvent(Unknown Source)

at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)

at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)

at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)

at java.awt.Container.dispatchEventImpl(Unknown Source)

at java.awt.Window.dispatchEventImpl(Unknown Source)

at java.awt.Component.dispatchEvent(Unknown Source)

at java.awt.EventQueue.dispatchEventImpl(Unknown Source)

at java.awt.EventQueue.access$500(Unknown Source)

at java.awt.EventQueue$3.run(Unknown Source)

at java.awt.EventQueue$3.run(Unknown Source)

at java.security.AccessController.doPrivileged(Native Method)

at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)

at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)

at java.awt.EventQueue$4.run(Unknown Source)

at java.awt.EventQueue$4.run(Unknown Source)

at java.security.AccessController.doPrivileged(Native Method)

at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)

at java.awt.EventQueue.dispatchEvent(Unknown Source)

at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)

at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)

at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)

at java.awt.EventDispatchThread.pumpEvents(Unknown Source)

at java.awt.EventDispatchThread.pumpEvents(Unknown Source)

at java.awt.EventDispatchThread.run(Unknown Source)
R

mostra o diretório, se tá dando nullpointer é pq nao achou a pasta

R

meu diretório não está errado mais vou mandar, pelo seu código o primeiro está abrindo então não é o diretório né?

R

R

Eu mandei abrir a pasta input, tá comentado ali.

O diretório que tem as pastas é esse WhatsappServer e a pasta que eu queria abrir era a input

R

Sim eu fiz um teste ali como se pode ver, peguei o disco C: agora e mandei abrir a pasta Intel que tem ali porém sem resultado viu ali os diretórios estão batendo normal

você alterou algo na classe AbridorDePastas?

R

image

É… Printei aqui e na pasta C:/ só mostra as pastas ocultas.
Agora tem que ver isso com o @staroski.

Só consegui entrando em uma sub pasta… Tipo: C:\\php


Tenta assim:

String nome_pasta = "Intel";
        String dir = "C:\\";
        
        File file = new File(dir);
        String[] pastas = file.list((File current, String name) -> new File(current, name).isDirectory());

        for (String nomes : pastas) {
            System.out.println(nomes);

            if (nomes.equals(nome_pasta)) {
                try {
                    System.out.println("tem a Intel :D, abrindo pasta...");
                    Desktop.getDesktop().open(new File(dir + nome_pasta));
                } catch (IOException ex) {
                    Logger.getLogger(NewClass.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }

Aqui abriu

R

Um método mais bonitinho:

public static void main(String[] args) {
    boolean status = listFolders("C:\\", "Intel");
    if(status){
        System.out.println("A pasta existe, estamos abrindo...");
    } else {
        System.out.println("A pasta não existe");
    }
}

private static boolean listFolders(String dirname, String subdir) {
    boolean status = false;
    File file = new File(dirname);
    File[] pastas = file.listFiles((File current, String name) -> new File(current, name).isDirectory());

    for (File nomes : pastas) {
        if (nomes.getName().equals(subdir)) {
            try {
                Desktop.getDesktop().open(new File(nomes.getAbsolutePath()));
                return true;
            } catch (Exception ex) {
                Logger.getLogger(NewClass.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    return status;
}
S

O listFiles em cima de alguma pasta oculta deve estar retornando null, provavelmente por causa de permissões.

Aqui não peguei esse problema pois o atalho do meu eclipse tá configurado pra executar como “Administrador”.

É só por um teste:

private void procurarAbrir(File pastaAtual, String pastaParaAbrir) {
    File[] pastasFilhas = pastaAtual.listFiles((FileFilter) file -> file.isDirectory());
    if (pastasFilhas == null) {
        return; // chega de NullPointerException
    }
    for (File pastaFilha : pastasFilhas) {
        if (pastaFilha.getName().equalsIgnoreCase(pastaParaAbrir)) {
            try {
                Desktop.getDesktop().open(pastaFilha);
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else {
            procurarAbrir(pastaFilha, pastaParaAbrir);
        }
    }
}
R

@staroski

staroski agora funciono certinho, porém está executando várias pasta iguais ao mesmo tempo como se fosse um loop coloco pra executa e abre várias até eu finalizar o java to tentando descobrir oque seja

tenho uma dúvida também sabe me dizer se tenho como utilizar isso para um pasta compartilhada na rede com senha? ao invés de usar o disco D://

R

orochi até funciono porém ele não faz as busca na subpastas

S

Você deve ter várias pastas com o mesmo nome, ou melhor, CPF, não é isso?

S

Então, a classe File serve apenas para representar arquivos e diretórios físicos do seu sistema operacional.

Por mais que o windows explorer renderize uma pasta remota como se fosse uma pasta local, do ponto de vista do Java isso não é um File.

Vais ter que usar alguma API de terceiros pra fazer isso, já ouvi falar num tal de jCIFS mas nunca utilizei.

R

pior que não eu fiz um teste normal aqui em uma pasta e continuo abrindo o botão fica travado como se eu tivesse pressionando ele

R

Aaaa sim entendi obg

S
Solucao aceita

Tem alguma pasta com links simbólicos que apontam pra pasta mais externa?

R

Já consegui resolver muito obrigado pela ajuda :grinning:

Criado 16 de julho de 2020
Ultima resposta 30 de jul. de 2020
Respostas 32
Participantes 3