Ler Subpastas de Diretório Raiz

É o seguinte galera, to criando um programinha que eu passo um diretório Raiz e ele vai ver todas as pastas e subpastas desse diretório e retornar o nome delas, pra depois eu acessar cada pasta e ler seus arquivos.

O programa já faz isso, entretanto de forma errada. Ele retorna o nome da pasta : Exemplo “futebol” e a subpastas dentro de “futebol” ele passa também como “jogador”, “goleiro”, “campo”.

Isto é, quando eu for acessar essas pastas para lerem os arquivos RAIZ+pastas, ele vai acessar somente, Exemplo C:\Dados\Futebol, C:\Dados\goleiro, C:\Dados\campo, não entrando dentro da pasta futebol.

Código de ler pastas

[code]package apl;

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

import model.Uteis;

public class TodasPastasRaiz {

public static ArrayList<String> Leitura(String diretorio, String pastaPai) {
	
	File dir = new File(diretorio);

	
	

	ArrayList<String> arquivos = new ArrayList<String>();
	
	String[] children = dir.list();

	if (children == null) {
		// Either dir does not exist or is not a directory
	} else {

		for (int i = 0; i < children.length; i++) {
			// Get filename of file or directory

			if ((children[i].contains(".htm"))
					|| (children[i].contains(".html")) ||(children[i].contains(".sig"))) {
			

			}
			else{
			//	System.out.println(diretorio);
				//System.out.println(children[i]);
				//System.out.println(pastaPai);
				
				TodasPastasRaiz.Leitura(Uteis.RAIZ+children[i]+"\\", children[i]);
				
				//System.out.println(pastaPai+"\\"+children[i]);
				
				arquivos.add(children[i]);
				
				
				if(pastaPai==""){
			
					
			}else{
				
			
			}
				
				
			}
		}
	}
	return arquivos;

}

}
[/code]

Main

[code]package main;

import java.util.ArrayList;

import apl.LerDiretorio;
import apl.LerHTML;
import apl.SalvarArquivo;
import apl.SalvarSeparado;
import apl.SalvarSomente;
import apl.TodasPastasRaiz;

import model.MapClass;
import model.Uteis;

public class mainMapeamento {

public mainMapeamento() {

}

public static void main(String[] args) {

	ArrayList<String> pastas = new ArrayList<String>();

	pastas = TodasPastasRaiz.Leitura(Uteis.RAIZ, "");

	for (int i = 0; i < pastas.size(); i++) {

		ArrayList<String> arquivos = new ArrayList<String>();
		// ArrayList com nome de todos Arquivos do Diretório

		//System.out.println(pastas.get(i));
		
		arquivos = LerDiretorio.Leitura(Uteis.RAIZ + pastas.get(i) + "\\");
		
		// Retorna lista com nome de todos os arquivos do Diretório

		for (int j = 0; j < arquivos.size(); j++) {

			//System.out.println(arquivos.get(j));
		}

		// imprimindo os arquivos encontrados no Diretório

		ArrayList<MapClass> arquivoMap = new ArrayList<MapClass>();
		// ArrayList com o Mapeamento

		arquivoMap = LerHTML.Leitura(arquivos, Uteis.RAIZ, pastas.get(i));
		// Retorna uma Lista contendo Nome, CSS, JS, Função e Infonet de
		// cada
		// arquivo html

		//SalvarArquivo.Salvar(arquivoMap, pastas.get(i));
		// salva cada html em um txt

		// SalvarSomente.Salvar(arquivoMap);
		// Salvar todos os HTML em um TXT
		
		
		SalvarSeparado.Salvar(arquivoMap, pastas.get(i));
		// Salvar várias vezes o mesmo HTML

	}
	System.out.println("Fim!");
}

}
[/code]

Após descobrir todas as pastas, acesso cada pasta lendo os arquivos


package apl;

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


public class LerDiretorio {

	public static ArrayList<String> Leitura(String pasta) {

		
		
		
		
		
		// System.out.println(Diretorio);
		File dir = new File(pasta);

		ArrayList<String> arquivos = new ArrayList<String>();
		String[] children = dir.list();

		if (children == null) {
			// Either dir does not exist or is not a directory
		} else {

			for (int i = 0; i < children.length; i++) {
				// Get filename of file or directory

				if ((children[i].contains(".htm"))
						|| (children[i].contains(".html"))) {
					
					//System.out.println(children[i]);
					arquivos.add(children[i]);

				}
			}
		}
		return arquivos;

	}
}

O que eu esqueci de dizer, é que eu preciso do caminho certinho, pois estarei salvando os arquivos em outras pastas mas com a mesma estrutura.(Leio HTMLS e salvo o que eu encontrei como .TXT)

Recursividade?

Você pegou a ideia corretamente (ou seja, precisa de um método recursivo para percorrer um diretório) mas não entendeu direito como é que você pode fazer o tal método (ou seja, como é que se faz para acumular os nomes de arquivos obtidos via recursão).

Vou repetir aqui um método que sempre uso para percorrer os subdiretórios de um diretório, só para você entender que, no seu caso, para fazer a parte de acumular os nomes de arquivos, é melhor fazer isso via parâmetro, não retorno de função. Como em Java é meio complicado lidar com rotinas recursivas, muitas vezes é necessário ter 2 rotinas (uma que faz a recursão e outra que prepara os parâmetros) para que as coisas funcionem adequadamente.

package guj;

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

public class ExemploListarArquivosRecursivamente {

    public List<File> listFiles (File directory) {
        List<File> files = new ArrayList<File>();
        listFiles (files, directory);
        return files;
    }
    
    private void listFiles (List<File> files, File directory) {
        for (File file : directory.listFiles()) {
            if (file.isDirectory()) {
                listFiles (files, file);
            } else {
                files.add (file);
            }
        }
    }
    
    /**
     * @param args
     */
    public static void main(String[] args) {
        ExemploListarArquivosRecursivamente e = new ExemploListarArquivosRecursivamente();
        // Exemplo:
        List<File> files = e.listFiles(new File ("c:\\windows\\system32\\drivers"));
        for (File f : files) {
            System.out.println (f.getAbsolutePath());
        }
    }

}

A propósito, vamos adaptar esse método para pegar só os arquivos “.dll”. Um momentinho…

O exemplo que dou abaixo é com as extensões “.exe” e “.dll”.

package guj;

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

public class ExemploListarArquivosRecursivamente {

    public List<File> listFiles(File directory) {
        List<File> files = new ArrayList<File>();
        listFiles(files, directory);
        return files;
    }

    private void listFiles(List<File> files, File directory) {
        File[] filesAndSubdirectories = directory.listFiles();
        if (filesAndSubdirectories != null) {
            for (File file : filesAndSubdirectories) {
                if (file.isDirectory()) {
                    listFiles(files, file);
                } else {
                    files.add(file);
                }
            }
        }
    }

    private boolean endsWith(File filename, List<String> extensions) {
        String name = filename.getName();
        for (String ext : extensions) {
            if (name.toLowerCase().endsWith(ext.toLowerCase()))
                return true;
        }
        return false;
    }

    public List<File> listFiles(File directory, List<String> extensions) {
        List<File> files = new ArrayList<File>();
        listFiles(files, directory, extensions);
        return files;
    }

    private void listFiles(List<File> files, File directory, List<String> extensions) {
        File[] filesAndSubdirectories = directory.listFiles();
        if (filesAndSubdirectories != null) {
            for (File file : filesAndSubdirectories) {
                if (file.isDirectory()) {
                    listFiles(files, file, extensions);
                } else {
                    if (endsWith(file, extensions)) {
                        files.add(file);
                    }
                }
            }
        }
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        ExemploListarArquivosRecursivamente e = new ExemploListarArquivosRecursivamente();
        // Exemplo :
        List<String> extensions = Arrays.asList(new String[] {
            ".exe", ".dll"
        });
        List<File> files = e.listFiles(new File("c:\\windows\\system32"), extensions);
        for (File f : files) {
            System.out.println(f.getAbsolutePath());
        }
    }

}