[Résolu] Filtrer les fichiers d'un répertoire

Filtrer les fichiers d'un répertoire [Résolu] - Java - Programmation

Marsh Posté le 03-10-2006 à 09:58:12    

Hello,
je cherche à faire un truc très classique : trouver tous les fichiers d'un répertoire qui respectent un masque (bidule*.csv par exemple).
J'ai essayé d'utiliser listFiles + FilenameFilter mais je ne comprends pas la syntaxe :

Code :
  1. File ioRepTravail = new File(sNomRepTravail);
  2. File[] tabioSourceFile = ioRepTravail.listFiles(new FilenameFilter("bidule*.csv" ));
  3. for ( int i=0; i<tabioSourceFile.length; i++ )
  4. {
  5.    traitement sur tabioSourceFile...
  6. }


=> message d'erreur = [i]java.io.FilenameFilter is abstract; cannot be instantiated
 
Quelqu'un peut m'aider svp ?


Message édité par Peanuty le 03-10-2006 à 22:57:50
Reply

Marsh Posté le 03-10-2006 à 09:58:12   

Reply

Marsh Posté le 03-10-2006 à 10:10:26    

Tu dois écrire une classe qui implémente FilenameFilter et qui accepte ce que tu cherches
 
Cf javadoc
 
http://www.google.fr/search?hl=fr& [...] ogle&meta=
:/

Reply

Marsh Posté le 03-10-2006 à 10:16:18    

:ouch:  
Et un truc simple ça n'existe pas (peut-être avec d'autres classes) ?
 
C'est dingue quand même, c'est le genre de truc qui doit être utilisé dans un paquet de programmes tous les jours. :sarcastic:  
 
Merci, je vais essayer de comprendre comment faire ça. Je sens que je vais encore adorer le Java...  :pfff:

Reply

Marsh Posté le 03-10-2006 à 10:17:43    

avec une regexp ca prend 4 lignes à coder ...
 
tin les jeunes d'aujourd'hui ....

Reply

Marsh Posté le 03-10-2006 à 10:20:05    

benou a écrit :

avec une regexp ca prend 4 lignes à coder ...
 
tin les jeunes d'aujourd'hui ....


 
Sauf que le filtre sera passé en paramètre à l'éxécution. :/

Reply

Marsh Posté le 03-10-2006 à 10:20:45    

Peanuty a écrit :

Sauf que le filtre sera passé en paramètre à l'éxécution. :/


ben avec une 2e regexp qui créé celle dont tu auras besoin ... (ca fait une ligne de plus du coup :o)

Reply

Marsh Posté le 03-10-2006 à 10:30:41    

Ouais, je peux aussi redéfinir ma propre grammaire de regexp. On peut aller loin comme ça. :/
Franchement je ne comprends pas qu'une commande basique comme ça n'existe pas.  :jap:  
Enfin voilà.

Reply

Marsh Posté le 03-10-2006 à 10:35:14    

c'est vraiment pas grand chose à faire, hein ...
 
et ca pourait exister, mais c'est consédéré comme quelque chose de spécifique ...
et ca se tient je trouve ...

Reply

Marsh Posté le 03-10-2006 à 11:47:24    

1h plus tard...  :D  
J'ai enfin -presque- réussi à utiliser ce fameux Filtername "qui n'est pas grand chose à faire".  :whistle:  
 

Code :
  1. File ioRepTravail = new File(sNomRepTravail);
  2. File[] tabioSourceFile = ioRepTravail.listFiles(new Filtre(sMasqueFicDonnees));
  3. // rq : sMasqueFicDonnees est récupéré dans args[]
  4. for ( int i=0; i<tabioSourceFile.length; i++ )
  5. {
  6.    traitement sur tabioSourceFile[i]...
  7. }


Code :
  1. class Filtre implements FilenameFilter
  2. {
  3. private String sRegex;
  4. public Filtre(String sMasque)
  5. {
  6.  // Conversion des regex : OS -> Java
  7.  // * -> .++
  8.  sRegex = sMasque.replaceAll("*", ".++" );
  9.  // ? -> .
  10.  sRegex = sMasque.replaceAll("?", "." );
  11. }
  12. public boolean accept(File sRepAFiltrer, String sNomFic)
  13. {
  14.  return sNomFic.matches(sRegex);
  15. }
  16. }


Ca tourne, sauf la conversion des regex en format Java.  
sRegex = sMasque.replaceAll("*", ".++" ); => Dangling meta character '*' near index 0 à l'exécution
J'ai essayé aussi  
sRegex = sMasque.replace("*", ".++" ); => replace(char,char) in java.lang.String cannot be applied to (java.lang.String,java.lang.String) à la compilation

Reply

Marsh Posté le 03-10-2006 à 11:50:31    


replaceAll prend une regex en premier parametre, une string en deuxieme, donc faut excaper ton * en \\*
replace prend des char donc pas des strings [:souk]

Reply

Marsh Posté le 03-10-2006 à 11:50:31   

Reply

Marsh Posté le 03-10-2006 à 11:53:36    

sans dire que là ton premier replaceAll sert à rien vu que tu ecrase son résultat par le 2e ...

Reply

Marsh Posté le 03-10-2006 à 14:52:26    

souk a écrit :

replaceAll prend une regex en premier parametre, une string en deuxieme, donc faut excaper ton * en \\*


Ah ok, j'avais essayé avec 1 seul \.
Et j'ai ajouté le . aussi.
 

Citation :

replace prend des char donc pas des strings [:souk]


C'était marqué des "CharSequence" dans l'API.
 

benou a écrit :

sans dire que là ton premier replaceAll sert à rien vu que tu ecrase son résultat par le 2e ...


:whistle:  
 
Donc au final :

Code :
  1. public Filtre(String sMasque)
  2. {
  3.  // Conversion des regex : OS -> Java
  4.  // . -> \\. /!\ test à garder en 1ère position
  5.  sRegex = sMasque.replaceAll("\\.", "\\\\\\." );
  6.  // * -> .++
  7.  sRegex = sRegex.replaceAll("\\*", ".*" );
  8.  // ? -> .
  9.  sRegex = sRegex.replaceAll("\\?", "." );
  10. }


Merci.  :jap:

Message cité 1 fois
Message édité par Peanuty le 04-10-2006 à 10:47:54
Reply

Marsh Posté le 03-10-2006 à 17:32:45    

Peanuty a écrit :

C'était marqué des "CharSequence" dans l'API.


ben tu regardes les javadocs 1.5 et tu compiles en 1.4 ou cette methode n'existe pas [:souk]

Reply

Marsh Posté le 03-10-2006 à 21:00:02    

Reply

Marsh Posté le 03-10-2006 à 21:07:04    

pratique ça ...

Reply

Marsh Posté le 03-10-2006 à 22:31:15    


 
Ah ben voilà.  :bounce:  
(bon, maintenant que ça marche j'y touche plus, mais ça pourra servir à d'autres, ou pour la prochaine fois  :) )

Reply

Marsh Posté le 03-10-2006 à 22:35:21    

benou a écrit :

pratique ça ...


Oui il y a pas mal de choses intéressantes dans les jakarta commons.
 
Le problème que je vois avec la méthode listFiles() c'est qu'elle renvoie un tableau contenant l'ensemble des fichiers correspondants. Ca me paraît risqué dans le cas où un nombre important de fichiers correspondent au filtre.
 
Sinon je cherche un filtre gèrant les expressions à la Ant (où ** cherche dans tous les sous répertoires)  :)

Message cité 1 fois
Message édité par charly007 le 03-10-2006 à 22:36:58
Reply

Marsh Posté le 03-10-2006 à 22:42:36    

charly007 a écrit :

Oui il y a pas mal de choses intéressantes dans les jakarta commons.
 
Le problème que je vois avec la méthode listFiles() c'est qu'elle renvoie un tableau contenant l'ensemble des fichiers correspondants. Ca me paraît risqué dans le cas où un nombre important de fichiers correspondent au filtre.
 
Sinon je cherche un filtre gèrant les expressions à la Ant (où ** cherche dans tous les sous répertoires)  :)


 
Bon ben j'enlève le [Résolu] alors si tu veux avoir des réponses.  ;)  

Reply

Marsh Posté le 03-10-2006 à 22:45:13    

Peanuty a écrit :

Bon ben j'enlève le [Résolu] alors si tu veux avoir des réponses.  ;)


Non tu peux laisser  ;) , de toute manière pour ce besoin je vais devoir utiliser autre chose que listFiles à cause du problème que j'ai cité précédemment.


Message édité par charly007 le 03-10-2006 à 22:45:26
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed