Te paso un código que hice algún tiempo de esto mismo, espero que te ayude.
private ArrayList<File> vector = new ArrayList<File>();
/*LISTAR TODO*/
public ArrayList
<File
> listarTodo
(File dir
) {
vector.clear();
listarT(dir);
return vector;
}
private void listarT
(File dir
) {
if (dir.isDirectory())
{
vector.add(dir);
String[] children
= dir.
list(); for (int i = 0; i < children.length; i++)
listarT
(new File(dir, children
[i
]));
} else
vector.add(dir);
}
/*LISTAR SOLO SUBCARPETAS*/
public ArrayList
<File
> listarCarpetas
(File dir
) {
vector.clear();
listarC(dir);
return vector;
}
private void listarC
(File dir
) {
if (dir.isDirectory())
{
vector.add(dir);
String[] children
= dir.
list(); for (int i = 0; i < children.length; i++)
listarC
(new File(dir, children
[i
])); }
}
/*LISTAR TODO SIN SUBCARPETAS*/
public ArrayList
<File
> listarSinRepeticion
(File dir
) {
vector.clear();
listarSR(dir);
return vector;
}
private void listarSR
(File dir
) {
if (dir.isDirectory())
{
vector.add(dir);
String[] children
= dir.
list(); for (int i = 0; i < children.length; i++)
vector.
add(new File(dir, children
[i
]));
} else
vector.add(dir);
}
/*LISTAR SOLO CARPETAS SIN SUBDIRECTORIOS*/
public ArrayList
<File
> listarCarpetasSinRepeticion
(File dir
) { vector.clear();
listarCSR(dir);
return vector;
}
private void listarCSR
(File dir
) { if (dir.isDirectory())
{
vector.add(dir);
String[] children
= dir.
list(); for (int i = 0; i < children.length; i++)
if(new File(dir, children
[i
]).
isDirectory()) vector.
add(new File(dir, children
[i
])); } else
vector.add(dir);
}
Este código funciona perfectamente y lo que hace es guardar los Files en un ArrayList en lugar de imprimirlo por pantalla (y de ese modo poder obtener de forma rápida del File, del parent path y del file name).
Tengo también el código donde guardo toda esa info en un fichero donde además tabulo los archivos dentro de directorios creando una estructura de árbol como dices. El único detalle es que lo implementé hace muchísimo tiempo y es un poco desastre el código además de contener interfaz gráfica medio incrustado por el código.
Ahora que conozco el modelo vista controlador vuelvo a mis inicios y cuando veo mis códigos me doy cierta vergüenza xD