Recherche de fichier avancée

[Résolu/Fermé]
Signaler
Messages postés
66
Date d'inscription
vendredi 1 septembre 2006
Statut
Membre
Dernière intervention
1 août 2012
-
Messages postés
66
Date d'inscription
vendredi 1 septembre 2006
Statut
Membre
Dernière intervention
1 août 2012
-
Bonjour,

J'ai un petit programme qui me permet de rechercher des fichiers mais j'aimerais l'améliorer en lui permettant d'utiliser des caratères génériques genre '*' ou '?'.

J'ai trouvé des codes sourcse sur ce forum pour faire celà mais je me demande conceptuellement comment faire pour mettre tout ça en place.

Comment ferriez vous à ma place ?

Voici ce que j'ai pour chercher des fichiers (trouvé sur ce site) :

essai(new File(Regles[i].getHomeDir()),"Test".toLowerCase());  // J'aimerais pouvoir mettre autre chose que "Test". Par exemple : "2006*.log"
...
private static void essai(File f,String s)
    {
        if(f.getName().contains(s))
        {
            if(f.isFile()) listFiles.add(f.getPath());
            if(f.isDirectory()) listFolders.add(f.getPath());
        }
        
        File[] liste_fils = f.listFiles();
        
        if(liste_fils!=null)
        {
            for(int i=0;i<liste_fils.length;i++)
            {
                essai(liste_fils[i],s);
            }
        }
    }

Et voici ce que j'ai trouvé pour utiliser les "JOKER" :
 /*
 *    Classe StringPattern:
 *    teste si une String match avec une expression donnée contenant (ou non) certain
 *    caractéres JOKER.
 *    '*' : de 0 a n caractéres (n'importe lequel)
 *    '?' : 1 caractére (n'importe lequel)
 *
 *
 *    utilisation:
 *        création d'une expression filtre
 *        StringPattern tTest = new StringPattern(*EXPRESSION*);
 *        exemple:
 *            StringPattern tTest = new StringPattern("a?b*t");
 *        puis application du filtre a une string tTest.matchs(**chaine a tester**)
 *            exemple tTest.matchs("albert");
 *
 *        ou testMatchsExpression(**chaine a tester**,*EXPRESSION*);
 *
 *    @autor BScrk
 */
 
 class StringPattern
 {
  
     private String pattern;
    
     public StringPattern(String thePattern)
     {
         pattern = thePattern;
     }
    
     public StringPattern()
     {
     }
    
     public void setPattern(String thePattern) { pattern = thePattern; }
     public String getPattern() { return pattern; }
    
    
    
     public boolean testMatchsExpression(String word , String sPattern)
     {
         pattern = sPattern;
         return matchsR(word,sPattern);
     }
    
     public boolean matchs(String word)
     {
         return matchsR(word,pattern);
     }
    
        
        
     private boolean matchsR(String word , String sPattern)
     {
         //System.out.println(word+">"+sPattern);
         if (sPattern.length()==0) return (word.length()==0); //Base si sPattern est vide alors word doit etre vide
         if ((word.length()==0)) // si word est vide sPattern ne peut valoir que a * (1 a n fois)
         {    
              if (sPattern.charAt(0)=='*')
                 return matchsR(word,sPattern.substring(1,sPattern.length()));
              return false;
         }         if ( ( word.charAt(0) sPattern.charAt(0) ) || (sPattern.charAt(0) '?') )
         {        // Invariant 1 = word[i]=sPattern[i] ou sPattern[i]='?' avec i indice
                 return matchsR(word.substring(1,word.length()),sPattern.substring(1,sPattern.length()));
         }                   
         else if (sPattern.charAt(0) == '*')
         {             if (sPattern.length() 1) return true; //toujours vrai pour sPattern "*"
             if (sPattern.charAt(1)=='*')// elimination des * superflus
                 return matchsR(word,sPattern.substring(1,sPattern.length()));   
             else
             {
                 int nbCar = (sPattern.substring(1,sPattern.length())).length();
                 boolean test = false;
                 String newPattern = sPattern.substring(1,sPattern.length());                 while ( nbCar <word.length() && test false )
                 {
                     test = matchsR(word,newPattern);
                     newPattern = "?"+newPattern;
                     nbCar++;
                 }
                 return test;
             }
         }
         return false; //sinon
     }
    
     /*public static void main(String args[]) {
    
         StringPattern tTest = new StringPattern();
         System.out.println(tTest.testMatchsExpression("testa","tes*a"));
         System.out.println(tTest.testMatchsExpression("tazeazetazeazet","t*?"));       
     }*/   
       
    
 }

5 réponses

Messages postés
124
Date d'inscription
dimanche 5 octobre 2003
Statut
Membre
Dernière intervention
11 mai 2009
15
et bien tout simplement (d'après les commentaires de la classe StringPattern)
dans ta fonction essai tu remplaces

if(f.getName().contains(s)){
...
}

par

StringPattern sTest=new StringPattern(s);
if (sTest.match(f.getName())){
...
}
Je pense que ça doit correspondre

Bonne continuation, a+
Messages postés
108
Date d'inscription
samedi 31 juillet 2004
Statut
Membre
Dernière intervention
12 septembre 2009
3
Bonjour
Bah ya un moyen mais sans pattern
je te conseille de decouper ton critere de recherche "2006*.log" par rapport a * ,en utilisant : java.util.StringTokenizer
puis lister tous les fichiers dont le nom commance par le premier mot generé par de decoupage a savoir ici 2006, en utilisant la methode <startsWith()> de la class String;
et qui finissent par le 2e mot a savoir ici .log ,en utilisant la methode <endsWith()> de la class String
et pour finir voici le code pour lister un repertoire tres legerement ameliore

String[] liste;
File dir = new File(rep);
                       if(dir.isDirectory() && dir.canRead()) //ici j'ai rajoute canRead()
                         liste= dir.list();
 
;-)                    
oqwtkt fgdwv swg fg xkxtg c igpqwz
Messages postés
124
Date d'inscription
dimanche 5 octobre 2003
Statut
Membre
Dernière intervention
11 mai 2009
15
C'est un peu plus complexe que ca, les expressions qu'il aura à traiter ne seront pas toutes du type abc*defgh, un utilisateur peut chercher un fichier avec des expressions plus ardues que ça, je pense que le pattern est fait exactement pour ce qu'il cherche à implémenter...
Messages postés
108
Date d'inscription
samedi 31 juillet 2004
Statut
Membre
Dernière intervention
12 septembre 2009
3
Oui je suis d'acord;j'ai proposé une solution plus simple mais beaucoup moin performante que les patterns

;-)
oqwtkt fgdwv swg fg xkxtg c igpqwz
Messages postés
66
Date d'inscription
vendredi 1 septembre 2006
Statut
Membre
Dernière intervention
1 août 2012

Whaaa cool merci