feed-image RSS | matteo.ferrone@yahoo.it | Your IP Address is: 54.234.126.92 | Sabato, 18 Maggio 2013

Mattepuffo.com

Listare file e directory in Java

Dettagli

Vi posto una semplice classe che permette di listare file e directory in maniera ricorsiva di una cartella che decidete voi.

Nello specifico il programma è per console, ma è facilmente espandibile per un'applicazione grafica.

In avvio di programma vi viene chiesto quale directory volete listare.

Dopo di che partono i vari metodi:

  • sortList
  • validateDir
  • listingDir

Il metodo centrale è sortList che prima lancia validateDir per validare la directory, e poi costruisce la stringa con listingDir.

 

Vediamo il tutto:

import java.io.*;
import java.util.*;

public class ListDirConsole {

 public static void main(String args[]) throws FileNotFoundException, IOException {
 System.out.println("Immetti il percorso");
 System.out.println();
 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 String path = br.readLine();
 File dir = new File(path);
 StringBuilder lista = sortList(dir);
 System.out.println();
 System.out.println(lista);
 }

 private static void listingDir(File dir, int livello, StringBuilder sb) {
 String spazio = "";
 File[] elementi = dir.listFiles();
 for (int l = 0; l < livello; l++) {
 spazio += "  |_";
 }
 Arrays.sort(elementi, new myComparator());
 for (File files : elementi) {
 sb.append(spazio).append(files.getName()).append("\n");
 if (files.isDirectory()) {
 listingDir(files, livello + 1, sb);
 }
 }
 }

 public static StringBuilder sortList(File dir) throws FileNotFoundException {
 validateDir(dir);
 StringBuilder sb = new StringBuilder();
 listingDir(dir, 0, sb);
 return sb;
 }

 private static void validateDir(File dir) throws FileNotFoundException {
 if (dir == null) {
 throw new IllegalArgumentException("Directory should not be null.");
 }
 if (!dir.exists()) {
 throw new FileNotFoundException("Directory does not exist: " + dir);
 }
 if (!dir.isDirectory()) {
 throw new IllegalArgumentException("Is not a directory: " + dir);
 }
 if (!dir.canRead()) {
 throw new IllegalArgumentException("Directory cannot be read: " + dir);
 }
 }
}

Nel metodo main usiamo questa riga

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

per far scrivere il path all'utente (attraverso System.in).

Poi viene lanciato sortList che ritorna uno StringBuilder:

StringBuilder lista = sortList(dir);

passandolgi dir come argomento.

Prima viene lanciato validateDir per controllare la validità della directory, poi viene istanziato uno StringBuilder che viene costruito tramite validateDir:

private static void listingDir(File dir, int livello, StringBuilder sb) {
 String spazio = "";
 File[] elementi = dir.listFiles();
 for (int l = 0; l < livello; l++) {
 spazio += "  |_";
 }
 Arrays.sort(elementi, new myComparator());
 for (File files : elementi) {
 sb.append(spazio).append(files.getName()).append("\n");
 if (files.isDirectory()) {
 listingDir(files, livello + 1, sb);
 }
 }
 }

Questo metodo accetta tra parametri: un File per directory da listare, un int per controllare i vari livelli delle sottodirectory e uno StringBuilder per costruire l'output.

Ho usato uno SringBuilder in quanto al contrario di String è possibile costruirlo dinamicamente; non è statico insomma.

La stringa spazio server per distinguire tra i file e le directory in modo da capire quale è una dir e quali file dentro le dir.

L'array di File è costruito attraverso il metodo listFiles che ritorna un arry di path dei file e directory peresenti.

Attraverso questa riga ordiniamo l'array usando myComparator, del quale ho parlato in questo articolo:

Arrays.sort(elementi, new myComparator());

Nel ciclo foreach costruiamo l'output:

for (File files : elementi) {
sb.append(spazio).append(files.getName()).append("\n");
if (files.isDirectory()) {
listingDir(files, livello + 1, sb);
}   
}

In pratica a sb aggiungiamo la stringa spazio più il nome del file e un \n per andare a capo.

Nell'if controlliamo se è un file o una directory, e in questo secondo caso rilanciamo il metodo aumentando il livello di uno (ricorsione).

Il risultato è più facile guardarlo che spiegarlo.

 

Ringrazio andbin del forum HTML.it per l'aiuto!

Aggiungi commento


   
© Matteo Ferrone