PDA

View Full Version : [Java]Ottenere lista file di cartella e sottocartelle


SwatMaster
28-07-2010, 23:28
Salve a tutti.
Sto provando a fare un piccolo applicativo Java che dovrebbe restituirmi un file di testo contenente la lista di tutti i file di una cartella indicata e di tutte le sue sottocartelle... Ottenere la lista dei fila della cartella indicata non è un problema, ma ottenere anche quelli di tutte le sottocartelle mi sta dando qualche grattacapo.
In teoria, basterebbe realizzare un metodo ricorsivo ad hoc, ma a quanto pare il codice non è corretto: compila ed esegue, ma mi restituisce solo i file della cartella indicata, ignorando le sottocartelle. Qualche idea?

public String[] listSubDir(File dir) {
LinkedList<String> temp = new LinkedList<String>();
File[] list = dir.listFiles();
for (int i = 0; i < list.length; i++){
if (list[i].isDirectory())
this.listSubDir(list[i]);
else {
String[] split = list[i].getName().split("\\.");
String str = split[0];
if (split.length > 2)
for (int k = 1; k < split.length - 1; k++)
str += "." + split[k];
temp.add(str);
}
}
String[] temp1 = temp.toArray(new String[temp.size()]);
return temp1;
}

Kenger
28-07-2010, 23:40
Il tuo problema è dovuto al fatto che ogni chiamata ricorsiva ti ritorna un array che dovrebbe contenere tutti i file sotto di essa e che tu ignori. Infatti l'unica cosa che ti scrive è cioè che ti restituisce la prima chiamata, che probabilmente è quello che passi al FileWriter. :)

SwatMaster
28-07-2010, 23:43
Sinceramente è un problema che così, a pelle, non saprei come risolvere :stordita:

Dovrei creare un secondo metodo (ricorsivo) che richiama questo?

Kenger
28-07-2010, 23:58
Nono, basta che appendi ogni volta il risultato a temp. Ti farei un esempio ma non sono molto fluente in java.

EDIT: Guardando meglio il codice mi sa che basta fare così


public String[] listSubDir(File dir) {
LinkedList<String> temp = new LinkedList<String>();
File[] list = dir.listFiles();
for (int i = 0; i < list.length; i++){
if (list[i].isDirectory())
temp.add(this.listSubDir(list[i]));
else {
String[] split = list[i].getName().split("\\.");
String str = split[0];
if (split.length > 2)
for (int k = 1; k < split.length - 1; k++)
str += "." + split[k];
temp.add(str);
}
}
String[] temp1 = temp.toArray(new String[temp.size()]);
return temp1;
}


Chiaramente però i file saranno ordinati in base all'ordine in cui vengono trovati. Per ovviare potresti far tornare alla funzione direttamente la lista e poi nella funzione che chiama per la prima volta la funzione ricorsiva ti troverai una lista che potrai ordinare come ti pare.

EDIT2: Manca ancora qualcosa perchè andresti ad aggiungere un String[] ad una lista di String. Ma non dovresti trovare problemi a risolverlo.

SwatMaster
29-07-2010, 00:46
Grazie mille per la risposta :)

Domani, con un po' più di lucidità, mi ci metterò dietro :D

luchky16
29-07-2010, 09:00
public String[] getFileList(String parent) {
List<String> files = new ArrayList<String>();
Stack<File> stack = new Stack<File>();
stack.push(new File(parent));
while(!stack.isEmpty()) {
File[] children = stack.pop().listFiles();
if(children == null || children.length == 0)
continue;
for(File f: children) {
if(f.isDirectory()) {
stack.push(f);
} else {
files.add(f.getName());
}
}
}
String[] ret = new String[files.size()];
files.toArray(ret);
return ret;
}
Ecco, ti restituisce un array con tutti i nomi dei files di una sub directory (che a sua volta può contenere altre cartelle)