IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Récupérer le dernier fichier créé d'un répertoire


Sujet :

Java

  1. #1
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2016
    Messages : 14
    Par défaut Récupérer le dernier fichier créé d'un répertoire
    Bonjour,

    J'essaie de créér une fonction qui récupère le dernier fichier créé dans un répertoire. La petite difficulté (là ou je bloque) c'est qu'il faut qu'il récupère que les fichiers contenant un certain mot.

    Donc voilà, j'ai écris ça


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    	String nom_utilisateur_windows  = System.getProperty("user.name");		
    		String directoryPath = "D:\\Profiles\\"+nom_utilisateur_windows+"\\Documents\\eve\\chatlogs";
     
    		File directory = new File(directoryPath);
    		File moreRecentFile = null;
     
    		if (!directory.exists()) {
    			System.out.println("Le fichier/répertoire '" + directoryPath + "' n'existe pas");
    		} else if (!directory.isDirectory()) {
    			System.out.println("Le chemin '" + directoryPath + "' correspond à un fichier et non à un répertoire");
    		} else {
    			File[] subfiles = directory.listFiles();
    			System.out.println("Le répertoire '" + directoryPath + "' contient " + subfiles.length + " fichiers");
     
    			if( subfiles.length > 0){
     
    				moreRecentFile = subfiles[0];
     
    				for (int i = 0; i < subfiles.length; i++) {
     
    					File subfile = subfiles[i];					
    					String test =subfile.toString();
    					boolean test1 = test.contains("CO2.Scout");			
    					System.out.println(test1);
    					if(test1 == true){
    						File subfiled = subfiles[i];	
    						System.out.println(subfiled.lastModified());	
    						System.out.println(moreRecentFile.lastModified());						
    						if (subfiled.lastModified() > moreRecentFile.lastModified()){ 						
    							moreRecentFile = subfiled;				
    							System.out.println("Le fichier le plus récent du répertoire " + directoryPath + " est " + moreRecentFile.getName());
    						}
     
    						}
    						else{
    							System.out.println(test1);
    						}
     
    				}
    			}
    			else{
    				System.out.println("Le répertoire ne contient pas de fichiers!!!");	
    				}
    		}
    Quand je teste subfiled.lastModified() et moreRecentFile.lastModified() me renvoi la même valeur alors qu'il ne devrait pas.

    Pouvez-vous m'aider?

    merci par avance.

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Déjà, tu affiches "Le fichier le plus récent du répertoire ..." à chaque fois que tu détectes un plus récent que le précédent trouvé.
    Il faut faire ça uniquement après la boucle, quand le plus récent a été déterminé.

    En plus, tu peux éliminer le premier dans la boucle, pour éviter de le comparer avec lui-même :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if( subfiles.length > 0){
     
    				moreRecentFile = subfiles[0];
     
    				for (int i = 1; i < subfiles.length; i++) {

    Par ailleurs, tu pourrais utiliser un FileNameFilter pour simplifier la boucle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    File[] subfiles = directory.listFiles(new FilenameFilter() {
     
    		@Override
    		public boolean accept(File dir, String name) {
    			return name.contains("CO2.Scout");
    		}
    	}
    );
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2016
    Messages : 14
    Par défaut
    Merci pour ta réponse.

    Mais je suis pas assez bon et du coup ta réponse m'est un peu nébuleuse :/.

    J'arrive pas bien à utiliser le fonction File[] subfiles = directory.listFiles(new FilenameFilter().

    Si j'ai compris le principe, si, le fichier contient le mot rechercher. Il renvoie la valeur true. Mais du coup, je le mets, dans ma boucle? Et comment je récupère cette fonction?

    Je continue à chercher de mon côté mais si tu pouvais m'éclairer. Merci dans tous les cas

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    La méthode listFiles() de la classe java.io.File permet d'obtenir l'ensemble des fichiers et sous-dossiers d'un dossier.
    Elle admet soit :

    • aucun paramètre
    • soit 1 paramètre, sous forme de filtre, qui indique les fichiers ou dossiers qui nous intéressent
      • soit de type java.io.FileFilter.
        L'interface a une seule méthode : boolean accept(File file) qui doit retourner true si le paramètre (un fichier ou un dossier) constituent un fichier à inclure dans la sélection et false sinon.
        Par exemple, si on ne veut que les fichiers et pas les sous-dossier :
        Code : Sélectionner tout - Visualiser dans une fenêtre à part
        1
        2
        3
        4
        5
        6
        7
        8
        File[] subfiles = directory.listFiles(new FileFilter() {
         
        		@Override
        		public boolean accept(File file) {
        			return file.isFile(); // ou !file.isDirectory()
        		}
        	}
        );
      • soit de type java.io.FilenameFilter.
        Le cas que j'ai utilisé dans mon exemple, sous forme de classe anonyme :
        Code : Sélectionner tout - Visualiser dans une fenêtre à part
        1
        2
        3
        4
        5
        6
        7
        8
        File[] subfiles = directory.listFiles(new FilenameFilter() {
         
        		@Override
        		public boolean accept(File dir, String name) {
        			return name.contains("CO2.Scout");
        		}
        	}
        );
        L'ensemble de ce que j'ai surligné en jaune constitue le filtre (l'implémentation de l'interface FilenameFilter sous forme de classe anonyme.
        L'interface a une seule méthode : boolean accept(File dir, String name) qui doit retourner true si les paramètres (le dossier et le nom du fichier à tester) constituent un fichier à inclure dans la sélection et false sinon. J'ai donc mis comme condition name.contains("CO2.Scout"), soit le nom du fichier (ou dossier) doit contenir la chaîne "CO2.Scout", la condition que tu avais mise. L'avantage, c'est qu'ensuite, on n'a plus qu'à traiter l'ensemble des fichiers tu tableau subfiles, puisqu'on aura que ceux qui ont le nom qu'on veut.
        Le résultat s'utilise donc exactement comme le résultat de listFiles() sans paramètre : c'est un tableau de File, null si le dossier n'existe pas (ou en cas d'erreur), vide si aucun fichier correspondant au filtre n'a été trouvé dans le dossier...

        A noter que j'ai utilisé la syntaxe de classe anonyme pour éviter de t'introduire la syntaxe par expression lamda, plus simple, mais ne fonctionnant qu'en Java 8+.
        Code : Sélectionner tout - Visualiser dans une fenêtre à part
        File[] subfiles = directory.listFiles((dir, name)-> name.contains("CO2.Scout"));



    L'implémentation complète

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    		String nom_utilisateur_windows  = System.getProperty("user.name");		
    		String directoryPath = "D:\\Profiles\\"+nom_utilisateur_windows+"\\Documents\\eve\\chatlogs";
     
    		File directory = new File(directoryPath);
     
    		if ( !directory.exists() ) {
    			System.out.println("Le fichier/répertoire '" + directoryPath + "' n'existe pas");
    		} else if (!directory.isDirectory()) {
    			System.out.println("Le chemin '" + directoryPath + "' correspond à un fichier et non à un répertoire");
    		}
    		else {
    			File[] subfiles = directory.listFiles(new FilenameFilter() {
     
    				@Override
    				public boolean accept(File dir, String name) {
    					return name.contains("CO2.Scout");
    				}
    			});
    			if ( subfiles!=null && subfiles.length>0 ) {
    				File moreRecentFile = subfiles[0];
    				for(int i=1; i<subfiles.length; i++) {
    					if ( subfiles[i].lastModified()>moreRecentFile.lastModified() ) {
    						moreRecentFile = subfiles[i];
    					}
    				}
    				System.out.println("Le fichier le plus récent du répertoire " + directoryPath + " est " + moreRecentFile.getName());
    			}
    			else {
    				System.out.println("Le répertoire ne contient pas de fichiers!!!");	
    			}
     
    		}
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2016
    Messages : 14
    Par défaut
    Avais pas vu ton implémentation complète, je regarde ça et je te pose d'autres questions


    =================================

    Donc si je comprends bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    File[] subfiles = directory.listFiles(new FilenameFilter() {
     
    				@Override
    				public boolean accept(File dir, String name) {
    					return name.contains("CO2.Scout");
    				}
    			});
    C'est dans la variable subfiles que contient le nom de mes fichier contenant ma recherche. Donc pas besoin de faire d'appel de fonction. (je ne sais pas du tout ce qu'est une fonction anonyme)

    Ensuite, j'ai plus qu'a tester si la valeur subfiles à une valeur. Si oui, je fais ma boucle.


    Merci de me dire si j'aime bien compris et encore un grand grand merci

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par gorenda Voir le message
    C'est dans la variable subfiles que contient le nom de mes fichier contenant ma recherche. Donc pas besoin de faire d'appel de fonction. (je ne sais pas du tout ce qu'est une fonction anonyme)
    Oui, ça t'évite d'avoir à faire le code que tu faisais dans la boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    String test =subfile.toString();
    					boolean test1 = test.contains("CO2.Scout");			
    					System.out.println(test1);
    					if(test1 == true){
    subfiles ne contient déjà que les fichiers pour lesquels ce test est vrai. Tu n'as donc effectivement qu'à chercher celui qui a le lastModified() le plus récent dans le tableau subfiles.

    Une classe anonyme, pas une fonction anonyme. Une classe anonyme = une classe sans nom. Quand tu écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public class Truc {
        /* ... n'importe quoi ... */
    }
    Tu crées une classe qui s'appelle Truc, une classe donc qui a un nom.

    Ensuite, tu l'instancies par new Truc().

    Une classe anonyme n'a pas de nom et non seulement on l'instancie directement en donnant le nom d'une superclasse (classe parente) ou interface, et on met l'implémentation directement juste après dans la même instruction où on fait le new.

    Ecrire donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    File[] subfiles = directory.listFiles(new FilenameFilter() {
     
    				@Override
    				public boolean accept(File dir, String name) {
    					return name.contains("CO2.Scout");
    				}
    			});
    Revient à faire d'un côté une classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class MonFiltre implements FilenameFilter {
     
       @Override
       public boolean accept(File dir, String name) {
          return name.contains("CO2.Scout");
       }
     
    }
    et d'autre part à faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    File[] subfiles = directory.listFiles(new MonFiltre());
    Utiliser une classe anonyme évite donc d'avoir à créer explicitement une classe nommée à part.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  7. #7
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2016
    Messages : 14
    Par défaut
    Merci c'est super clair

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Récupérer le dernier fichier d'un répertoire
    Par andrech dans le forum Développement de jobs
    Réponses: 8
    Dernier message: 16/06/2015, 11h26
  2. [Batch] Récupérer le dernier fichier créé
    Par hakkio dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 07/12/2013, 00h43
  3. Récupérer les derniers caractères d'une ligne d'un fichier texte
    Par Laaris dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 05/01/2009, 16h06
  4. Récupérer le premier ou dernier fichier d'une liste
    Par adlmdi dans le forum Scripts/Batch
    Réponses: 5
    Dernier message: 11/09/2007, 10h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo