Newsgroup: it.comp.java
Titolo: FilenameFilter Inteface

Ciao a tutti!
Tanto per cambiare necessito di un aiuto...
Ho bisogno di recuperare i files contenuti in una directory del file system
il cui nome inizia con un certo prefisso.
Pensavo di applicare all'istanza dell'oggetto File che mi rappresenta la
directory il metodo  "String[] list(FilenameFilter filter)" ma non riesco a
capire come posso definire il filtro... Non so come usare le interfacce :-(
GRAZIE
Elena


per quanto riguarda le interfaccie guarda questo link di mokabyte
http://www.mokabyte.it/1999/10/interfacce.htm
ed ...
ecco per te il pezzo di codice che dovrebbe fare al caso tuo ....
Bisogna prima di tutto creare una classe che estenda l'interfaccia
FileFilter ... in questo modo ...
class myFilter implements FileFilter
{
  String prefix = null;
// Creo il costruttore che accetta in ingresso il PREFISSO dei file da
associare ...
// lo cambio in maiuscolo per fare le cose in CASE INSENSITIVE :)
  public myFilter( String m_prefix )
  {
     prefix = m_prefix.toUpperCase();
  }
// Questo metodo fà parte dell'interfaccia e và implementato .. in pratica
deve restituire true se il file è da considerare
// o false altrimenti.
public boolean accept(java.io.File file)
  {
    if ( file.isDirectory() )
    {
      return false;
    }
      /// Controllo se il file inizia con la stringa passatagli ....(lo
trasformo in maiuscolo per fare il controllo in case-insensitive)
     return ( file.getName().toUpperCase().startsWith( m_path ) );
  }
}
... poi quando crei l'oggetto File devi fare ...
File f = new File( "*.*" );
File[] fileList = f.listFiles( new myFilter( "PREFISSO DEL FILE" ) );
...questo dovrebbe risolvere i tuoi problemi .....
... spero di non aver fatto troppi errori :-) ma non ho provato il codice
.... quindi chiedo scusa a tutto il newsgroup se ci sono dei bacherozzi :)))
Ciao ciao
Dani

Ti ringrazio per i consigli che mi hai dato :-)
Volevo sapere però come mai il mio codice non funziona... Io ho provato a
scrivere una mia classe che estende l'interfaccia FilenameFilter, avente il
seguente codice (traendo spunto da quanto avevi scritto tu):
package mypackage;
import java.io.*;
public class MyFilenameFilter implements FilenameFilter
{
  private String prefix = null;
  public MyFilenameFilter(String m_prefix)
  {
    this.prefix = m_prefix;
  }
  public boolean accept(File dir, String name)
  {
    File f = new File(name);
    if (name.startsWith(prefix) && f.isFile())
    {
      return true;
    }
    else
    {
      return false;
    }
  } // End of accept()
} // End of class MyFilenameFilter
Quindi l'ho compilata e non ricevo messaggi di errori. Poi ho scritto
un'altra classe che include questa e che ha un metodo che si occupa di
generare una lista dei file contenuti nella directory considerata che
iniziano con il prefisso che mi interessa.
Ecco il codice:
package mypackage;
import mypackage.MyFilenameFilter;
public class MiaClasse{
    ..................
    public String mioMetodo(String dir, String prefix)
    {
        ....................
        File f_dir;
        String[] listFiles;
        f_dir = new File(dir);
        listFiles = f_dir.list(new MyFilenameFilter(prefix));
        return "pippo";
        .................
    }
  } // End of mioMetodo()
} //End of  class MiaClasse
Anche questa classe l'ho compilata e non mi dá  messaggi di errore. Poi ho
scritto un'altra classe che richiama il mioMetodo() della MiaClasse ma non
riesco a capire perchè l'array che dovrebbe contenere la lista dei files che
mi interessano ha lunghezza pari azero, eppure nella directory considerata
ci sono dei files :-(
Cosa ho sbagliato? Non riesco a capire....
Grazie Elena

Buongiorno Elena,
mmmmm .... ho ricontrollato il mio codice e credo di averti fatto sbagliare
la chiamata del costruttore dell'oggetto File.
Se vuoi,per esempio, visualizzare tutti i file contenuti nella cartella
"pippo" allora devi fare la chiamata cosě:
...
f_dir = new File( "c:\\pippo" );
..
Senza ovviamente mettere *.* (altrimenti a che servirebbe costruire un
filtro) ... mi scuso per l'imprecisione.Mi spiace.
Spero che ora funzioni...
quindi mi raccomando occhio ai parametri che passi al tuo metodo "mioMetodo"
Ciao ciao
Dani
--
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
If at first the idea is not absurd then there is no hope for it. - Albert
Einstein
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Mi ero accorta che la chiamata non era corretta, cmq il mio codice non
funziona neanche passandogli il path della directory che voglio esplorare
:-(
Non capisco perché, sono sicura che dipenda dalla definizione del filtro, io
uso FilenameFilter invece di Filter perché mi interessa avere un array di
stringhe contenenti i nomi dei files che soddisfano il filtro, dunque devo
utilizzare il metodo "list(FilenameFilter filter)" della classe File invece
che "listFiles(FileFilter filter)". Se non metto alcun filtro l'array che
ottengo non é vuoto, ma a questo punto devo poi farmi il controllo a manina
e la cosa mi scoccia un po' visto che la scorciatoia esiste e sono io che
non la so usare :-(
Mi è venuto il dubbio che l'errore si trovi nel tipo di prefisso che passo
al filtro.... io mettevo solo i primi caratteri con cui volevo che iniziasse
il nome del file, non è che invece devo aggiungere anche il path della
directory in cui si trova?
Mi spiego...
Se ad esempio analizzo la directory "pippo" che ha path "c:\pluto\pippo", mi
interessano i files che iniziano con "top" cioè del tipo "top*.*", non è che
il prefisso lo devo passare con "c:\pluto\pippo\top*.*"?
ecco il mio codice:
package mypackage;
import java.io.*;
public class MyFilenameFilter implements FilenameFilter
{
  private String prefix = null;
  public MyFilenameFilter(String m_prefix)
  {
    this.prefix = m_prefix;
  }
  public boolean accept(File dir, String name)
  {
    File f = new File(name);
    if (name.startsWith(prefix) && f.isFile())
    {
      return true;
    }
    else
    {
      return false;
    }
  } // End of accept()
} // End of class MyFilenameFilter
package mypackage;


 il prefisso lo devo passare con "c:\pluto\pippo\top*.*"?
[CUT]
No Elena, .... se a te interessano i file che iniziano con top ... nel
prefisso devi passare proprio "top" e basta ..e non "top*.*"
altrimenti ti cercherebbe i file che iniziano con l'esatta sequenza di
caratteri top*.* ...
Altra cosuccia .. ricordati che se tu hai questa lista di files
PIPPO1,pippo2 e paperino nella directory disnery e chiami il tuo metodo con
questa sintassi:
mioMetodo( "c:\\disney","pip" );
riceverai in uscita SOLO il file pippo2 in quanto il controllo che stai
facendo è case-sensitive e quindi il file PIPPO1 non inizia con pip ma con
PIP !!! ....
Se hai ancora problemi fammi sapere ...
Ciao


Visto che ti sei interessato ai miei problemi mi sembrava giusto farti
sapere cosa c'era che non andava... il problema non era nel fatto che il
confronto che io facevo era case sensitive nel modo in cui avevo definito il
metodo accept del filtro, infatti io al suo interno istanziavo un oggetto
file utilizzando la stringa name che gli passavo come parametro, ma questa
contiene solo il nome del file analizzato, senza il path, quindi la
condizione che avevo messo nell'if risultava sempre falsa, ora sembra
funzionare... :-)
GRAZIE per il tempo che mi hai dedicato e i consigli illuminanti (L'articolo
che mi hai suggerito era molto interessante e mi ha chiarito le idee!!!)
Ecco come ho modificato la mia classe che implementa l'interfaccia:
package mypackage;
import java.io.*;
public class MyFilenameFilter implements FilenameFilter
{
  private String prefix = null;
  public MyFilenameFilter(String m_prefix)
  {
    this.prefix = m_prefix;
  }
public boolean accept(java.io.File dir, java.lang.String name)
  {
    String pathFile;
    pathFile = dir.getPath() + File.separator + name;
    File f = new File(pathFile);


Hai ragione che sbadato! ... ma non era più comodo per te usare il sistema
che avevo scritto io all'inizio del thread?
in quel modo (se implementi la classe FileFilter) al metodo accept arriva
direttamente un oggetto di tipo File e puoi fare tutti i controlli che vuoi
senza però istanziarne di nuovi...
Ciao ciao
Dani

Hai ragione anche tu, ma sono un po' contorta e mi piace complicarmi la vita
e poi volevo capire come mai non funzionava. Per cui alla fine è diventata
una questione di principio e una sfida fra me e quella stramaledettissima
classe che non voleva funzionare!!!
;-)
Ciao ciao e ancora grazie
Elena

ehehhehe ... posso capirti benissimo! capita spesso anche a me :-)
però ora che hai vinto .. è meglio usare l'altra strada ...
ciao ciao
