Java directorydaricorsivocercare file in
Java Qui presentiamo un programma di esempio che cerca ricorsivamente i file in una directory specificata, incluse le sottodirectory, e ottiene un elenco di file che corrispondono alle condizioni di ricerca.
Eseguono la stessa elaborazione del comando UNIX ls -R e del comando Windows dir /s.
È inoltre possibile specificare * come carattere jolly nel nome del file da cercare oppure utilizzare le espressioni regolari per eseguire la ricerca.
Come esempio di utilizzo, nel caso seguente, la directory filelist viene cercata ricorsivamente includendo le sottodirectory per ottenere un elenco di file con estensione java.
File[] file = search.listFiles(“C:/filelist/”, “*.java”);
programma di esempio
/**
*
*/
classe pubblica FileSearch {
public static final int TYPE_FILE_OR_DIR = 1;
public static final int TYPE_FILE = 2;
public static final int TYPE_DIR = 3;
/**
* Dalla directory specificata [directoryPath],
* Cerca il file [fileName] da cercare ricorsivamente e trova il file corrispondente.
* Restituisce un elenco di oggetti file.
*
* esempio)
* File[] file =listFiles(“C:/filelist/”, “*.java”);
* L'esempio sopra cerca ricorsivamente l'elenco dei file della directory e
* Ottieni un elenco di file con estensione java.
*
* @param directoryPath Percorso che rappresenta la directory in cui cercare
* @param fileName Nome del file da cercare
* È possibile specificare * come carattere jolly nel nome del file.
* @return Oggetto file corrispondente alla ricerca
*/
public File[] listFiles(String directoryPath, String fileName) {
// Converte * come carattere jolly in un'espressione regolare
if (nomefile!= null) {
nomefile = nomefile.sostituisci(“.”, “\\.”);
nomefile = nomefile.replace(“*”, “.*”);
}
return listFiles(directoryPath, fileName, TYPE_FILE, true, 0);
}
/**
* Dalla directory specificata [directoryPath], specificata come espressione regolare
* Cerca ricorsivamente il file da cercare [fileNamePattern],
* Restituisce un elenco di oggetti file applicabili.
*
* È inoltre possibile utilizzare la condizione di ricerca per determinare se la data di aggiornamento del file ha superato il numero di giorni specificato.
* Può essere specificato.
*
* esempio)
* File[] file =
* listFiles(“C:/filelist/”, “*.java”,TYPE_FILE, true, 2);
* Nell'esempio precedente, l'elenco dei file della directory viene cercato in modo ricorsivo e aggiornato meno di 7 giorni fa.
* Ottieni un elenco di file con estensione java.
*
* @param directoryPath Percorso che rappresenta la directory in cui cercare
* @param fileNamePattern Nome del file da cercare [espressione regolare]
* @param type L'oggetto file corrispondente è specificato da [type].
* È possibile specificare quanto segue
* TYPE_FILE_OR_DIR・・・File e directory
* TIPO_FILE・・・File
* TYPE_DIR・・・Directory
* @param isRecursive true per la ricerca ricorsiva
* @param period Cerca i file la cui data di aggiornamento ha superato il numero di giorni specificato.
* Può essere impostato o meno
* Non applicabile se 0
* Se 1 o più, cerca i file dopo il numero di giorni specificato
* Se inferiore a -1, cerca i file più vecchi del numero di giorni specificato
* @return Oggetto file corrispondente alla ricerca
*/
public File[] listFiles(String directoryPath,
String fileNamePattern, tipo int,
booleano isRecursive, int periodo) {
File dir = nuovo File(percorsodirectory);
if (!dir.isDirectory()) {
lancia una nuova IllegalArgumentException
(“Percorso specificato in argomento[” + dir.getAbsolutePath() +
“] non è una directory.”);
}
File[] file = dir.listFiles();
// il suo output
for (int i = 0; i < file.lunghezza; i++) {
File file = file[i];
addFile(tipo, modelloNomeFile, set, file, punto);
// Cerca in modo ricorsivo e aggiungi all'elenco in modo ricorsivo se si tratta di una directory
if (isRecursive && file.isDirectory()) {
listFiles(file.getAbsolutePath(), fileNamePattern,
tipo, isRecursive, punto);
}
}
return (File[]) set.toArray(new File[set.size()]);
}
private void addFile(int tipo, String match, TreeSet set,
File file,int periodo) {
interruttore (tipo) {
caso TYPE_FILE:
se (!file.isFile()) {
ritorno;
}
rottura;
caso TYPE_DIR:
if (!file.isDirectory()) {
ritorno;
}
rottura;
}
if (corrispondenza!= null && !file.getName().matches(corrispondenza)) {
ritorno;
}
// Se è specificato se è trascorso il numero di giorni specificato
se (punto!= 0) {
// Data di aggiornamento del file
Data lastModifiedDate = new Date(file.lastModified());
String lastModifiedDateStr = new SimpleDateFormat(“aaaaMMgg”)
.format(ultimadatamodificata);
// Data specificata (calcolata in millisecondi al giorno)
lungo unGiornoOra = 24L * 60L * 60L * 1000L;
lungo periodoOra = unGiornoOra * Math.abs(periodo);
Data designataData =
nuova data(System.currentTimeMillis() – periodTime);
Stringa designataDateStr = new SimpleDateFormat(“aaaaMMgg”)
.format(Datadesignata);
se (periodo > 0) {
if (lastModifiedDateStr.compareTo(designatedDateStr) < 0) {
ritorno;
}
} altro {
if (lastModifiedDateStr.compareTo(designatedDateStr) > 0) {
ritorno;
}
}
}
// Memorizza nell'elenco se tutte le condizioni sono soddisfatte
set.add(file);
}
/** Usa TreeSet per ordinare in ordine alfabetico. */
set di TreeSet privato = nuovo TreeSet();
/**
* Se desideri continuare a utilizzare l'istanza dopo averla creata, utilizza questo metodo.
* La chiamata deve essere cancellata.
* esempio)
* Ricerca FileSearch = nuovo FileSearch();
* File[] f1 = search.listFiles(C:/filelist/”, “*.java”);
* ricerca.clear();
* File[] f2 = search.listFiles(“C:/filelist/”, “*.jsp”);
*/
public void clear(){
set.clear();
}
}
Risultato dell'esecuzione
Per verificare il programma di esempio, ho creato una directory filelist e preparato i seguenti file.
Vengono visualizzati il nome del file e la data di aggiornamento.
*Si prega di notare che la data attuale è2007/08/18Supponiamo che lo sia.
C:\filelist │ aaa.java 2007/08/18 │ bbb.java 2007/08/18 └─dir ccc.java 2007/07/17 ddd.java 2007/08/18 eee.jpg 2007/08/16
◆Esempio di esecuzione
System.out.println(“\n→Scarica tutti i file”);
File[] file = search.listFiles(percorso, null);
stampaListaFile(file);
ricerca.clear();
System.out.println(“\n●Ottieni file con estensione java”);
file = search.listFiles(percorso, “*.java”);
stampaListaFile(file);
ricerca.clear();
System.out.println(“\n→Prendi tutti i file e le directory”);
file = search.listFiles(percorso, null,search.TYPE_FILE_OR_DIR, true, 0);
stampaListaFile(file);
ricerca.clear();
System.out.println(“\n→Ricevi i file aggiornati entro 2 giorni dalla data corrente”);
file = search.listFiles(percorso, null,search.TYPE_FILE, true, 2);
stampaListaFile(file);
ricerca.clear();
System.out.println(“\n→Recupera i vecchi file più vecchi di 30 giorni dalla data corrente”);
file = search.listFiles(percorso, null,search.TYPE_FILE, true, -30);
stampaListaFile(file);
ricerca.clear();
}
private static void printFileList(File[] files) {
for (int i = 0; i < file.lunghezza; i++) {
File file = file[i];
System.out.println((i + 1) + “: ” + file);
}
}
◆Risultato dell'output
● Ottieni tutti i file 1: C:\filelist\aaa.java 2: C:\filelist\bbb.java 3: C:\filelist\dir\ccc.java 4: C:\filelist\dir\ddd.java 5: C:\filelist\dir\eee.jpg ● Ottieni file con estensione java 1: C:\filelist\aaa.java 2: C:\filelist\bbb.java 3: C:\filelist\dir\ccc .java 4: C:\filelist\dir\ddd.java ●Ottieni tutti i file e le directory 1: C:\filelist\aaa.java 2: C:\filelist\bbb.java 3: C:\filelist\dir 4: C:\filelist \dir\ccc.java 5: C:\filelist\dir\ddd.java 6: C:\filelist\dir\eee.jpg ●File aggiornati entro 2 giorni dalla data corrente Ottieni 1: C:\filelist\aaa. java 2: C:\filelist\bbb.java 3: C:\filelist\dir\ddd.java 4: C:\filelist\dir\eee.jpg ●Data corrente Ottieni vecchi file più vecchi di 30 giorni da 1: C: \filelist\dir\ccc.java