[java]récupérer le fichier le plus récent

Fermé
kifouillou Messages postés 170 Date d'inscription mardi 27 septembre 2005 Statut Membre Dernière intervention 28 janvier 2011 - 25 janv. 2007 à 11:09
 nvibel - 30 déc. 2012 à 15:24
Bonjour,

Encore un post et oui sur la programmation en java.
Donc mon souci aujourd'hui c'est de pouvoir récupérer le fichier le plus récent d'une liste de fichier d'un répertoire et d'afficher le contenu. Je pense qu'il ya quelques lignes à rajouter dans mon code mais je ne sais pas trop où et quoi(je crois que pour la lecture il faut utiliser Bufferred file reader et iterator mais j'en sais pas plus). Voici mon code qui me permet de récupérer tous les fichiers du dossier C:\temp. :

package exemple;

import java.io.*;

public class test {

public test() {
super();
}

public void findFiles(String directoryPath) {
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();
String message = "Le répertoire '"+directoryPath+"' contient "+ subfiles.length+" fichier"+(subfiles.length>1?"s":"");
System.out.println(message);
for(int i=0 ; i<subfiles.length; i++){
System.out.println(subfiles[i].getName());
}
}
}

public static void main(String[] args) {
test finder = new test();
finder.findFiles("C:/temp");

}
}

Merci d'avance.
A voir également:

9 réponses

Voilà un bout de code qui permet de connaître le fichier le plus récent d'un dossier en java :

		String directoryPath = "c:\\folder_perso";
		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 = 1; i < subfiles.length; i++) {
					File subfile = subfiles[i];
					//System.out.println(subfile.getName());
					
					if (subfile.lastModified() > moreRecentFile.lastModified()) 
						moreRecentFile = subfile;
				}
				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!!!");
			}
		}


Voilà un bout de code qui permet de lister et de supprimer tous les fichiers d'un dossier en java :

		//This code remove all files in a folder
		String directoryPath = "c:\\folder_perso";
		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();
			System.out.println("Le répertoire '" + directoryPath + "' contient " + subfiles.length + " fichiers");
			
			for(int i = 0 ; i < subfiles.length; i++){
				System.out.println(subfiles[i].getName());
				subfiles[i].delete();
				System.out.println("Fichier " + subfiles[i].getName() + " supprimé.");
			}
		}
3
C'est hyper précis et clair , je l'ai utilisé et ça marche , merci Alino-91, franchement tu mérites de travailler chez Google , bonne continuation
0
Utilisateur anonyme
25 janv. 2007 à 11:47
Salut!

Juste un conseil avant de te donner le code: en Java, le nom d'une classe commence toujours par une majuscule.

Les modifications et ajouts apparaissent en gras dans le code.

;-)

package exemple;

import java.io.*;

public class Test {

	public Test() {
		super();
	}

	public void findFiles(String directoryPath) {
		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();
			String message = "Le répertoire '" + directoryPath + "' contient " + subfiles.length + " fichier"
					+ (subfiles.length > 1 ? "s" : "");
			System.out.println(message);
			for (int i = 0; i < subfiles.length; i++) {
				File subfile = subfiles[i];
				System.out.println(subfile.getName());
				if (moreRecentFile != null && subfile.lastModified()>moreRecentFile.lastModified()) {
					moreRecentFile = subfile;
				} else {
					moreRecentFile = subfile;
				}
			}
			System.out.println("Le fichier le plus récent du répertoire "+directoryPath +" est "+moreRecentFile.getName());
		}
	}

	public static void main(String[] args) {
		Test finder = new Test();
		finder.findFiles("C:/temp");

	}
}
1
kifouillou Messages postés 170 Date d'inscription mardi 27 septembre 2005 Statut Membre Dernière intervention 28 janvier 2011 9
25 janv. 2007 à 11:59
Salut,

C'est trop cool, merci beaucoup. Sa m'affiche donc le fichier le fichier le plus récent dans la console. Juste une dernière info stp. Pour tester le fichier text le plus récent, je suppose qu'il faut rajouter l'extension .txt quelque part. Pourrais tu me préciser juste sa s'il te plait?

Encore merci.

edit: j'ai essayé :
if(subfiles[i].endWith(".txt")==true){

mais endWith il ne l'admet pas pour le type file donc y aurait t'il un équivalent ?
0
kifouillou Messages postés 170 Date d'inscription mardi 27 septembre 2005 Statut Membre Dernière intervention 28 janvier 2011 9
25 janv. 2007 à 12:33
Donc en plus du problème avec le fichier texte, il me retourne pas ce que je veux. Il me retourne un fichier mais pas le bon. J'ai céer un fichier dans le répertoire Temp. Le problème c'est que quand je compile il me retourne un autre fichier que le .txt que je viens de créer alors que la date de modif du document .txt est plus récente que l'autre fichier. Je comprend plus trop là. Si tu peux m'aider?

Merci d'avance.
0
Utilisateur anonyme
25 janv. 2007 à 12:58
Salut!

Pour tester sur le nom du fichier, remplce:

if(subfiles[i].getAbsolutePath().endsWith(".txt")==true){
if(subfiles[i].endWith(".txt")==true){ 


par:

if(subfiles[i].getAbsolutePath().endsWith(".txt")==true){ 


;-)
0
kifouillou Messages postés 170 Date d'inscription mardi 27 septembre 2005 Statut Membre Dernière intervention 28 janvier 2011 9 > Utilisateur anonyme
25 janv. 2007 à 13:21
Yo,

Il affiche le nombre de fichier dans le répertoire temp. Mais au lieu de m'afficher les fichiers .txt et ensuite de me dire quel fichier txt est le plus récent, il me génère une erreur :

Le répertoire 'C:/temp' contient 74 fichiers
Exception in thread "main" java.lang.NullPointerException
at exemple.Test.findFiles(Test.java:32)
at exemple.Test.main(Test.java:39)
J'ai juste remplacé la ligne que tu m'as dit de modifier par la tienne.
Une idée?
Encore merci en tout cas. On est tout près du but.
0
kifouillou Messages postés 170 Date d'inscription mardi 27 septembre 2005 Statut Membre Dernière intervention 28 janvier 2011 9 > Utilisateur anonyme
25 janv. 2007 à 14:11
Re Hacktrack,

J'ai trouvé pour récupérer le fichier text le plus récent et sa fonctionne.
sinon je pense avoir trouver le code pour ouvrir et lire ligne par ligne le fichier text. Le soucis c'est que je sais pas si c'est juste et ce qu'il faut mettre dans le while. Et surtout ou placer cette partie du code.

String ligne ;

try
{
BufferedReader br = new BufferedReader (new FileReader (moreRecentFile)) ;

while ((ligne = br.readLine()) != null)
{
// mon traitement
}

}
catch (Exception e)
{
e.printStackTrace () ;
}
Encore merci
0
kifouillou Messages postés 170 Date d'inscription mardi 27 septembre 2005 Statut Membre Dernière intervention 28 janvier 2011 9
25 janv. 2007 à 14:51
Hack me lache pas

lol
0
kifouillou Messages postés 170 Date d'inscription mardi 27 septembre 2005 Statut Membre Dernière intervention 28 janvier 2011 9
25 janv. 2007 à 16:10
Personne ne sait? C'est super important svp.Je galère et désèspère la.

Il faut juste le code pour ouvrir et afficher les 2 lignes du fichier qui est le plus récent. Voici mon code juska maintenant.

package exemple;

import java.io.*;

public class Test {

public Test() {
super();
}

public void findFiles(String directoryPath) {
File directory = new File(directoryPath);
File moreRecentFile = null;

// verification des parametres
if(!directory.exists()){
System.out.println("Le fichier/répertoire '"+directoryPath+"' n'existe pas");
return;
}
if(!directory.isDirectory()){
System.out.println("Le chemin '"+directoryPath+"' correspond à un fichier et non à un répertoire");
return;
}

// liste des fichiers "*.txt"
File[] files = directory.listFiles(
new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.toLowerCase().endsWith(".txt");
}
}
);

// cas alternatif: pas de fichiers "*.txt"
if (files.length==0) {
System.out.println("Pas de fichier texte");
return;
}

// cas general: parcours et memorise le plus recent fichier
moreRecentFile=files[0];
for(File f:files) {
if (f.lastModified()>moreRecentFile.lastModified())
moreRecentFile = f;
}

System.out.println("Le fichier le plus récent du répertoire "+directoryPath +" est "+moreRecentFile.getName());




}









public static void main(String[] args) {
Test finder = new Test();
finder.findFiles("C:/temp");


}
}

Merci d'avance.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
kifouillou Messages postés 170 Date d'inscription mardi 27 septembre 2005 Statut Membre Dernière intervention 28 janvier 2011 9
25 janv. 2007 à 17:19
Hack, t

u saurais pas comment résoudre mon problème par hasard?

mon fichier text est composé de 2 lignes :
nom\tprénom\tsociété\tfonction\tdate\r
MAS\tSébastien\tLivinfo\tDirecteur Commercial\t26\01\2007

les /t c'est pour les tabulations et le /r pour le retour chariot. J'ai créé ce fichier text à la main.

Maintenant il faudrait que je puisse le parser. Aide moi STP ou aidez-moi. Je galère encore trop une fois de plus.
0
Utilisateur anonyme
29 janv. 2007 à 10:09
Salut !

Le code pour lire le fichier est presque correct. Tu trouveras le code ci-dessous:

	public void displayTextFile(File textFile) {
		try {
			if (!new TextFileFilter().accept(textFile))
				return;
			BufferedReader br = new BufferedReader(new FileReader(textFile));
			String ligne = null;
			int index = 0;
			while ((ligne = br.readLine()) != null) {
				index++;
				System.out.println("[Ligne " + index + "] " + ligne);
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
	}


Avec TextfileFilter qui est une classe qui implémente l'interface FileFilter:

	/**
	 * This class implemenst FileFilter and is to be used to select text files
	 * only
	 * 
	 * @author HackTrack Created 29/01/2007
	 */
	class TextFileFilter implements FileFilter {
		// Liste des extensions acceptées pour les fichiers textes (à compléter)
		private String[] validSuffix = { "txt", "log", "vbs", "html", "css", "js" };

		public TextFileFilter() {
			super();
		}

		public boolean accept(File pathname) {
			if (pathname != null && !pathname.isDirectory()) {
				for (String suffix : validSuffix) {
					if (pathname.getAbsolutePath().endsWith(suffix))
						return true;
				}
			}
			return false;
		}
	}


Pour le reste, que veux-tu faire du texte que tu récupères de ton fichier? Le stocker dans un tableau de String?
0
kifouillou Messages postés 170 Date d'inscription mardi 27 septembre 2005 Statut Membre Dernière intervention 28 janvier 2011 9 > Utilisateur anonyme
29 janv. 2007 à 11:55
salut Hack,

Merci pour ta réponse et désolé pour mon retard, j'étais en week-end très chargé.

Concernant mon le code sa fonctionne. Quand je l'éxécute lance sa m'affiche le fichier le plus récent et sa me récupère les infos qu'il y a dedans. Sa c'est nikel.
Je l'ai intégré à mon appli et quand je la lance, au démarrage sa m'affiche les informations dans la console d'Eclipse.
Mon but c'est que ces informations se stockent dans les champs de mon appli créés à cet effet.
Je m'explique. J'ai une appli avec des champs(qui sont des labels). Je voudrais qu'au lancement de mon appli, les valeurs qui sont dans le fichier text, s'affichent dans les champs prévus.
Pour rappel , dans mon fichier text j'avais 2 lignes : la première avec le nom des champs et la deuxième avec les valeurs.
Voilà. C'est mon but final.

Par contre j'ai créer un fichier properties ou j'ai fais la même chose.
clé=valeur
Les clés correspondent aux nom des champs et les valeurs ben au valeurs de ces champs.
Avec lequel des deux fichiers dois-je travailler pour atteindre mon but et surtout comment faire.

Voilà. En espérant que tu as compris ce que j'ai écrit. N'hésites pas à me demander de plus amples explications si besoins est.

Merci d'avance.



edit : mon code pour gérer le fichier .properties c'est sa (la première valeur est lue en boucle j'ai du oublier quelque chose dans ma boucle pour qu'il passe à la suivante):

public static void main(String[] args) {
Properties prop = new Properties();
try {
prop.load(new FileInputStream("C:/Documents and Settings/LIVINFO/workspace/com.promotelec.exemple/src/promo_act.properties"));

Iterator it = prop.keySet().iterator();
while (it.hasNext()) {
String mesValeurs = prop.getProperty("catégorie");
System.out.println(mesValeurs);
}
} catch (Exception e) {
System.out.println("Erreur Exception" + e);
}


}
0
Utilisateur anonyme > kifouillou Messages postés 170 Date d'inscription mardi 27 septembre 2005 Statut Membre Dernière intervention 28 janvier 2011
29 janv. 2007 à 15:30
Salut!

Uitlise plutôt un fichier au format CSV (fichier texte, chaque donnée séparée par une virgule, même nombre de données par ligne)


Voici le code. Je t'expliquerai demain car je dois m'en aller

/*
 * Created on 29-janv.-2007
 * Author: Philippe Fery (philippefery@hotmail.com)
 */
package exemple;

import java.awt.Dimension;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.StringTokenizer;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class CSVFileParser {

	private ArrayList<ArrayList> dataTable;

	public CSVFileParser() {
		super();
	}

	public void parseFile(String path) throws FileNotFoundException, IOException {
		File csvFile = new File(path);
		if (!csvFile.exists())
			throw new FileNotFoundException("Le fichier n'existe pas");
		if (csvFile.isDirectory())
			throw new FileNotFoundException("Le chemin désigne un répertoire et non un fichier");
		if (!csvFile.getAbsolutePath().endsWith(".csv"))
			throw new FileNotFoundException("Le fichier n'est pas du type CSV (Comma Separated Value)");

		StringTokenizer lineParser;
		BufferedReader reader = new BufferedReader(new FileReader(csvFile));

		dataTable = new ArrayList<ArrayList>();
		ArrayList<String> dataRow;

		String line = null;
		String value = null;
		while ((line = reader.readLine()) != null) {
			dataRow = new ArrayList<String>();
			lineParser = new StringTokenizer(line, ",");
			while (lineParser.hasMoreElements()) {
				value = (String) lineParser.nextElement();
				dataRow.add(value);
			}
			dataTable.add(dataRow);

		}

	}

	public ArrayList<ArrayList> getDataList() {
		return dataTable;
	}

	/**
	 * 
	 * @param includeFirstRow
	 *            Si la première ligne de données doit être retournée
	 * @return Les données extraites du fichier CSV, null si le fichier ne
	 *         contient pas de données.
	 */
	public String[][] getDataArray(boolean includeFirstRow) {
		// La première ligne stocke le nom des champs, il faut donc 2 lignes
		// minimum pour disposer de données à lire.
		if (dataTable.size() < 2)
			return null;
		int rowCount = dataTable.size();
		ArrayList<String> firstRow = dataTable.get(0);
		int columnCount = firstRow.size();

		int firstRowIndex = (includeFirstRow ? 0 : 1);
		String[][] data = new String[rowCount - firstRowIndex][columnCount];
		for (int rowIndex = firstRowIndex; rowIndex < dataTable.size(); rowIndex++) {
			ArrayList<String> row = dataTable.get(rowIndex);

			for (int columnIndex = 0; columnIndex < firstRow.size(); columnIndex++) {
				data[rowIndex-firstRowIndex][columnIndex] = row.get(columnIndex);
			}
		}
		
		return data;
	}

	public String[] getFieldsName() {
		return getDataArray(true)[0];
	}

	public DefaultTableModel getTableModel() {
		System.out.println("Fields name:");
		for(String s: getFieldsName()){
			System.out.println(s);
		}
	
		return new DefaultTableModel(getDataArray(false), getFieldsName());
	}
	
	public static void main(String[] args){
		CSVFileParser parser = new CSVFileParser();
		try{
		parser.parseFile("d:/test.csv");
		String[][] fileData = parser.getDataArray(true);
		for(int row=0; row<fileData.length;row++){
			System.out.print("[");
			for(int col=0; col<fileData[0].length;col++){
				System.out.print(fileData[row][col]);
				if(col<fileData[0].length-1)
					System.out.print(",");
				
			}
			System.out.println("]");
		}
		
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		JPanel panel = new JPanel();
		JTable table = new JTable(parser.getTableModel());
		JScrollPane jsp = new JScrollPane(table);
		jsp.setPreferredSize(new Dimension(320,200));
		panel.add(jsp);
		frame.getContentPane().add(panel);
		frame.pack();
		frame.setVisible(true);
		
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}



;-)
Hacktrack
0
kifouillou Messages postés 170 Date d'inscription mardi 27 septembre 2005 Statut Membre Dernière intervention 28 janvier 2011 9
29 janv. 2007 à 14:56
re,


bon. C'est bon j'ai trouvé.

Par contre on ma laissé un fichier .WAR et on ma dit de l'importer dans Eclipse. D'accord je l'ai importé mais c'est tout crypté. J'arrive pas à le lire car il faut que je regarde le code source de ce fichier.

Quelqu'un sait comment procéder?
0
kifouillou Messages postés 170 Date d'inscription mardi 27 septembre 2005 Statut Membre Dernière intervention 28 janvier 2011 9
30 janv. 2007 à 09:35
Bonjour,

heu en fait je dois garder un fichier texte pour mon appli.
Voici mon code qui me permet de récupérer le fichier texte et de le lire :

private File getMostRecentFile(String directoryPath) {
File directory = new File(directoryPath);
File moreRecentFile = null;

// verification des parametres
if(!directory.exists()){
System.out.println("Le fichier/répertoire '"+directoryPath+"' n'existe pas");
return null;
}
if(!directory.isDirectory()){
System.out.println("Le chemin '"+directoryPath+"' correspond à un fichier et non à un répertoire");
return null;
}

// liste des fichiers "*.txt"
File[] files = directory.listFiles(
new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.toLowerCase().endsWith(".txt");
}
}
);

// cas alternatif: pas de fichiers "*.txt"
if (files.length==0) {
System.out.println("Pas de fichier texte");
return null;
}

// cas general: parcours et memorise le plus recent fichier
moreRecentFile=files[0];
for(File f:files) {
if (f.lastModified()>moreRecentFile.lastModified())
moreRecentFile = f;
}

System.out.println("Le fichier le plus récent du répertoire "+directoryPath +" est "+moreRecentFile.getName());
return moreRecentFile;
}

private Map<String,String> getFileContentAsMap(File file) throws IOException {
// verification des parametres
if (file==null) return null;

// flux de lecture du fichier
BufferedReader in = new BufferedReader(new FileReader(file));

// lecture 1ere ligne
String str = in.readLine();
String[] column = str.split("\t");

// lecture 2nde ligne
Map<String,String> map = new HashMap<String,String>();
str = in.readLine();
String values[] = str.split("\t");
for(int i=0;i<values.length;i++) {
if (i>=column.length) break; // plus de données que de colonne -> exit
map.put(column[i],values[i]);
System.out.println(column[i]+"="+values[i]);
}

in.close();
return map;
}


public Object run(Object args) throws Exception {

Application finder = new Application();
File f = finder.getMostRecentFile("C:/Temp");
Map<String,String> map = getFileContentAsMap(f)


- Maintenant que j'arrive à le lire il faudrait que j'arrive à insérer le contenu dans les différents labels.
- J'ai créé une autre classe qui correspond à une nouvelle vue. C'est là que j'ai mis tous mes composants SWT.
- Et donc j'aimerais remplir les labels correspondants par les valeurs du fichier texte.
- Je pense qu'il faut utiliser des get et des set mais je suis un peu perdu.

Voilà. J'espère que j'ai été assez clair.
Merci encore de votre aide.
0
Olllalala, Mdr Kiffouillou on dirait que tu galere pour ton stage, j'aurais pas penser te retrouver la !

Bon courage !
0
kifouillou Messages postés 170 Date d'inscription mardi 27 septembre 2005 Statut Membre Dernière intervention 28 janvier 2011 9
31 janv. 2007 à 12:43
Mustruuuuuuuuuuuuuuuuu

Ben dis donc. Enfin des nouvelles. Oai je galère. J'ai jamais fais de java auparavant. Je me suis acheté un livre sur eclipse et un autre sur java. Mais c'est chaud quand même. Je me fais autodidacte. Ben sa va le problème de ce post j'ai réussi à le résoudre ce matin tout seul. Mais j'en ai encore un et j'ai jusqu'à vendredi aprem pour le résoudre donc sa va. Comment s ava toi? Tu galère pas trop?
0
sophie26 Messages postés 25 Date d'inscription mercredi 17 janvier 2007 Statut Membre Dernière intervention 14 avril 2007 9
31 janv. 2007 à 14:10
Alors petit barbu tu as besoin d'aide.
Passe voir kelly à l'occasion elle aura la solution à ton problème.
Bizooooo kifouilou

sophie pro du street of rage ( Songoku pour les intimes )
0