Création de fichier index pour recherche rapide

Soyez le premier à donner votre avis sur cette source.

Vue 18 116 fois - Téléchargée 1 611 fois

Description

Ce programme sert à faire une recherche très rapide.
Il crée des fichiers (.log avez vous une autre extension à me proposer) qui sont des index des volumes choisis.
Puis vous pouvez faire une recherche (rapide) sur les fichier index de votre choix.
Les fichiers trouvés sont placés dans un composant "list". Vous pouvez lancer un fichier trouvé par double clique.
Plusieurs options sont possible pour la recherche :
Ignorer les majuscules, Ignorer les espaces et Ignorer les accents.
Pour le moment, seulement quelques caractères accentués sont pris en compte (environ 6 ou 7) mais sa va venir.
D'après un copain, très pratique pour faire des index de CD-Rom archive. Pas besoin de m'être tous les CD l'un après l'autre dans le lecteur. Merçi de m'indiquer les options qui peuvent être utiles pour que je les rajoute.
Je sait que le code n'est pas très beau mais sa marche. Je suis débutant (c'est mon deuxième programme et mon premier poster) alors comprenez...
Je suis pas très fort en français même pour mon age (15 ans)...

Source / Exemple :


import java.awt.* ;
import java.awt.event.* ;
import java.io.* ;
import java.util.Vector ;
import java.awt.datatransfer.* ;
 
public class index implements ActionListener, WindowListener, ItemListener, Runnable {

Frame F = new Frame("Index") ;
Toolkit tk = F.getToolkit() ;
Button B1 = new Button() ;
Button B2 = new Button() ;
Button B3 = new Button("Portée de la recherche") ;
TextField tf = new TextField() ;
List list = new List() ;
Label L = new Label() ;
PrintStream PS ; //écriture des fichiers indexation
File fichierIndex ; //fichier d'indexation
static File dossierIndex = new File("index") ; //Dossier où son ranger les fichiers d'indexation
String rech ; //mot à rechercher
Vector V = new Vector(8,5) ; 
int nombreDossier ; //compte rendu recherche 
int nombreFichier ;
StringBuffer SB = new StringBuffer() ;
String[] listvol ; //liste des volumes
String[] listindex = null; //liste des index
String extension = ".log" ; //extension pour les index
int mode = -1 ; //mode en cour (voir methode setMode)
Checkbox checkMaj = new Checkbox("Ignorer les majuscules",true) ;
Checkbox checkIgnoreSpace = new Checkbox("Ignorer les espaces") ;
Checkbox checkIgnoreAccent = new Checkbox("Ignorer les accents") ;
boolean ignoreMaj ;
boolean ignoreSpace ;
boolean ignoreAccent ;
Font FPetite = new Font("Sans",Font.PLAIN,10) ;
Font FGrosse = new Font("Sans",Font.PLAIN,12) ;
boolean tourne ;
boolean exit ;
int erreur = 0 ;

static {
	dossierIndex.mkdir() ;
}
	
	public static void main(String[] argv) {
		/*boolean graph = false ;
		if ((argv.length > 0) && (argv[0].equalsIgnoreCase("ui"))) {
			graph = true ;
		}
		new index(graph) ;*/
		new index() ;
	}
	//public index (boolean graph) {
	public index () {
		//if (graph) {
		F.addWindowListener(this) ;
			F.setLocation(300,100) ;
		Panel P = new Panel() ;
			P.setSize(440,420) ;
		P.setLayout(null) ;
		B1.addActionListener(this) ;
			B1.setBounds(20,20,140,20) ;
		B2.addActionListener(this) ;
			B2.setBounds(170,100,100,20) ;
		B3.addActionListener(this) ;
			B3.setBounds(280,100,140,20) ;
			B3.setActionCommand("portée") ;
		tf.addActionListener(this) ;
			tf.setBounds(20,100,140,20) ;
		list.addActionListener(this) ;
			list.addItemListener(this) ;
			list.setBounds(20, 140, 400, 260) ;
		checkIgnoreAccent.setBounds(280,10,150,20) ;
		checkIgnoreSpace.setBounds(280,40,150,20) ;
		checkMaj.setBounds(280,70,150,20) ;
		L.setBounds(20, 120, 400, 20) ;
		P.add(list) ; P.add(L) ; P.add(B1) ; P.add(B2) ; P.add(tf) ; P.add(B3) ; 
		P.add(checkMaj) ; P.add(checkIgnoreSpace) ; P.add(checkIgnoreAccent) ;
		F.add(P) ;
		setMode(0) ; //initialisation des composants graphiques
		 F.pack() ; F.setResizable(false) ; F.show() ;
		/*}
		else {
			execIndex() ;
			rech = "salut" ;
			recherche() ;
			Fermer() ;
		}*/
	}
	public void runThread() {
		Thread THR = new Thread(this) ;
		tourne = true ; 
		THR.start () ;
	}
	public void run() {
		if (mode == 4) { //execution du Thread d'indexation
			try {
				FileOutputStream FOS = new FileOutputStream(fichierIndex) ; //ouvre le flux de l'index à créer
				PS = new PrintStream(FOS) ; 
				for (int i = 0 ;(tourne) && (i < listvol.length) ; i++) {
					L.setText("Indexation de " + listvol[i]) ;
					File dir = new File(listvol[i]) ;
					PS.println(dir.getAbsolutePath()) ;
					indexdossier(dir,1) ;
				}
				PS.close() ; //ferme le flux
				if (! tourne) fichierIndex.delete() ;
			}
			catch (Exception e) {  /*erreur = 1*/ ; e.printStackTrace() ; } //*********************************************
			setMode(0) ;
			if (erreur != 0) L.setText(erreur + " erreur lors de l'indexation") ;
			tk.beep() ;
		}
		else if (mode == 1) { //recherche
			BufferedReader BR = null ;
			for ( int i = 0 ;(tourne) && (i < listindex.length) ; i++) {
				fichierIndex = new File(dossierIndex,listindex[i]) ;
				try {
					BR = new BufferedReader(new FileReader(fichierIndex)); //ouverture flux de lecture
					V.removeAllElements() ;
					String line ; //contient une ligne
					while (tourne && ((line = BR.readLine() ) != null)) Analyse(line) ; //Analyse la ligne
					BR.close() ; //femeture du flux
				}
				catch (Exception e) {
					System.out.println(fichierIndex) ;
					e.printStackTrace() ;
				}
			}
			traitResultat() ; //stastistique
			setMode(6) ;
		}
		if (exit) Fermer() ;
		tourne = false ;
	}
	public void recherche() {
		if ((listindex == null) && (mode != 5)) sourceRecherche() ;
		else execRecherche() ;
	}
	public void sourceRecherche() {
		list.removeAll() ;
		setMode(5) ;
		fichierExtension() ;
	}
	public void execRecherche() {
		if (mode == 5) listindex = list.getSelectedItems() ;
		if (listindex.length == 0) {
			L.setText("Aucun index selectionné pour effectuer la recherche") ;
			return ;
		}
		setMode(1) ;
		traiteOptions() ;
		nombreDossier = nombreFichier = 0 ; //compteur  à 0
		runThread() ; //lance la boucle de recherche dans un thread séparé
		//la fin du thread place le mode à 0
	}
	char[] charRech ;
	char[] charLine ;
	public boolean compare(String str) {
		if (ignoreMaj) str = str.toUpperCase() ;
		charLine = str.toCharArray() ;
		if (ignoreSpace) charLine = ignoreSpace(charLine) ;
		if (ignoreAccent) charLine = ignoreAccent(charLine) ;
		int i = 0 ;
		int y = 0 ;
		int espoir = -1 ;
		int c1 = charRech.length ;
		int c2 = charLine.length ;
		boolean esp = false ;
		while(true) {
			if (i == c1) return(true) ;
			if (y == c2) return(false) ;
			if (charLine[y] == charRech[i]){
				if (i == 0) { espoir = y ; esp = true ; }
				i++ ; y++ ;
			}
			else {
				if (esp) {
					y = espoir + 1 ; 
					i = 0 ;
					esp = false ;
				}
				else y++ ;
			}
		}
	}
	public void traiteOptions() {
		rech = tf.getText() ;
		ignoreMaj = checkMaj.getState() ;
		ignoreSpace = checkIgnoreSpace.getState() ;
		ignoreAccent = checkIgnoreAccent.getState() ;
		if (ignoreMaj) rech = rech.toUpperCase() ;
		charRech = rech.toCharArray() ; // transforme rech en tableau de caractères
		if (ignoreSpace) charRech = ignoreSpace(charRech) ;
		if (ignoreAccent) charRech = ignoreAccent(charRech) ;
	} 
	public char[] ignoreSpace(char[] ch) {
		int length = ch.length ;
		int y = 0 ;
		for (int i = 0; i < length ; i++ ) {
			if (! Character.isWhitespace(ch[i])) ch[y++] = ch[i] ;
		}
		if (length == y) return(ch) ;
		char[] retour = new char[y] ;
		System.arraycopy(ch,0,retour,0,y) ;
		return(retour) ;
	}
	public char[] ignoreAccent(char[] ch) {
		char c ;
		int length = ch.length ;
		for (int i = 0; i < length ; i++ ) {
			c = ch[i] ;
			if (c < 128) {
				SB.append(c) ; 
				continue ;
			}
			switch (c) { //**********************************
				case 'é' : 
				case 'è' :
				case 'ê' :
				case 'ë' : SB.append('e') ; break ;
				case 'à' : SB.append('a') ; break ;
				case 'ç' : SB.append('c') ; break ;
				case '?' : SB.append('o').append('e') ; break ;
				default : SB.append(c) ;
			}
		}
		length = SB.length() ;
		char[] retour = new char[length] ;
		SB.getChars(0,length,retour,0) ;
		SB.setLength(0) ;
		return(retour) ;
	}
	public void Analyse(String line) { //Analyse une ligne
		int i = 0 ;
		while (line.charAt(i) == '\t') { i++ ; }
		line = line.substring(i) ; //enleve les tabulations de la ligne
		boolean isDossier = line.endsWith("\\") ; //si dossier
		if (isDossier) { //met la ligne dans le vector au niveau du dossier
			if (V.size() == i ) V.addElement(line) ;
			else V.setElementAt(line, i) ;
		}
		if (compare(line)) { 
			for (int y = 0 ; y < i ; y++ ) {
				SB.append(V.elementAt(y)) ; //concaténe les éléments du path
			}
			if (isDossier) nombreDossier++ ; //met à jour le compte rendu de recherche
			else nombreFichier++ ;
			SB.append(line) ; //concaténe le nom du fichier au path
			list.addItem(SB.toString() ) ; //add à la list la chaine créée
			SB.setLength(0) ; //vide la chaine
		}
	}
	public void traitResultat() { //Créer des statistiques
		if (! tourne) {
			L.setText("Recherche annulée") ; 
			return ;
		}
		int nombreTotal = nombreDossier + nombreFichier ; //créer le total
		if (nombreTotal == 0) { //pas de résultat
			L.setText("Aucun resultat") ;
		}
		else {
			L.setText("Total : " + nombreTotal + " (" + nombreFichier +
							" Fichier(s), " + nombreDossier + " Dossier(s) )") ;
		}
	}
	public void ouvrirPath(String path) {
		File F = new File(path) ;
		if (! F.exists()) {
			L.setText("L'élément est introuvable") ; 
			return ;
		}
		L.setText("Ouverture...") ;
		path = '\"' + path + '\"' ; // guillemets, sinon start.exe echoue s'il y a un espace
		int pf = -1 ;
		String strOs = System.getProperty("os.name", "???") ;
		if ( strOs.equals("Mac OS") ) pf = 2 ; // Macintosh
		else if ( strOs.equals("Windows NT") ) pf = 1 ; // Windows NT, 2000 et XP
		else if ( strOs.equals("Windows 95") ) pf = 0 ; // Windows 95, 98 et Me
		boolean succes = false ;
		switch (pf) {
			case 0 : succes = startWin(path) ; break ;
			case 1 : succes = startNT(path) ; break ;
			default : L.setText("Ouverture sur la plate forme " + strOs + " non programmée") ;
		}
		if (! succes) L.setText("Echec de l'ouverture") ;
		else L.setText("") ;
	}
	public boolean startWin (String path) { // "start" lance l'exe lie a l'extension DOS (selon la base de registres)
		try { Runtime.getRuntime( ).exec (new String [] { "start ", path } ) ; } // lance la commande
		catch (IOException floc) { return (false) ; } // erreur : pas d'application, erreur commande = false
		return (true) ; 
	} // -------------------- fin de methode start 
	public boolean startNT (String path) { // "start" lance l'exe lie a l'extension DOS (selon la base de registres)
		try { Runtime.getRuntime( ).exec (new String [] { "cmd", "/c", "start", "\"\"",  path } ) ; }
		catch (IOException floc) { return (false) ; } // erreur : pas d'application, erreur commande = false
		return (true) ; 
	} // -------------------- fin de methode start
	public void actionPerformed(ActionEvent ae) {
		//Object source = ae.getSource() ;
		String command = ae.getActionCommand() ;
		if (command.equals("stop")) tourne = false ;
		else if (tourne) return ;
		else if (command.equals("getvol")) sourceIndex() ; //bouton 1 en mode 0(défault)
		else if (command.equals("saveas")) cibleIndex() ; //bouton 2 en mode 2(choix des volumes à indexer)
		else if (command.equals("lanceindexation")) execIndex() ; //bouton 2 en mode 3(choix fichier d'index)
		else if (command.equals("recherche")) recherche() ; //bouton 2 en mode 0,2,5(défault)
		else if (command.equals("portée")) { //bouton 3
			switch (mode) {
				case 0 :
				case 5 :
				case 6 : sourceRecherche() ;
			}
		}
		else if (command.equals("index0")) setMode(0) ;
		else {Object source =ae.getSource() ;
			if (source == tf) {
				switch (mode) {
					case 0 :
					case 5 :
					case 6 : recherche() ;
				}
			}
			else if (source == list) {
				switch (mode) {
					case 6 : ouvrirPath(command) ;
				}
			}
		}
	}
	public void itemStateChanged(ItemEvent ie)  {
		if (mode == 3) { //en mode de selection d'un fichier pour enregistrer l'index
			if (list.getSelectedIndex() == 0) tf.setText("index" + extension) ;
			else tf.setText(list.getSelectedItem()) ; //place le texte de l'item dans le text field
		}
	}
	public void setMode(int md) {
		if (md == mode) return ; //si mode inchanger : return ;
		switch (md) {
			case 0 : //Réinitialisation
				list.removeAll() ;
				tf.setText("") ;
				B1.setLabel("Indexer l'ordinateur") ;
				B1.setActionCommand("getvol") ;
				B2.setLabel("Rechercher") ;
				B2.setActionCommand("recherche") ;
				L.setText("") ;
				break ;
			case 1 : //Recherche en cours
				L.setText("Recherche en cours...") ;
				list.removeAll() ;
				B1.setLabel("Annuler") ;
				B1.setActionCommand("stop") ;
				list.setFont(FPetite) ;
				list.setMultipleMode(false) ;
				break ;
			case 2 : //Obtention des volumes
				L.setText("Selectionner les volumes à indexer et cliquer \"J'ai fini\" ") ;
				B1.setLabel("Annuler") ;
				B1.setActionCommand("index0") ;
				B2.setLabel("J'ai fini") ;
				B2.setActionCommand("saveas") ;
				list.setMultipleMode(true) ;
				list.removeAll() ;
				list.setFont(FGrosse) ;
				break ;
			case 3 : //demande d'emplacement et du nom de fichier pour l'enregistrement de l'index
				B2.setLabel("Enregistrer") ;
				B2.setActionCommand("lanceindexation") ;
				L.setText("Taper un nouveau nom ou cliquez sur un fichier existant") ;
				list.removeAll() ;
				list.setMultipleMode(false) ;
				break ;
			case 4 : //pendant l'indextation
				B1.setActionCommand("stop") ;
				B2.setLabel("Rechercher") ;
				B2.setActionCommand("rien") ;
				break ;
			case 5 : //porté de la recherche
				list.setMultipleMode(true) ;
				list.setFont(FGrosse) ;
				break ;
			case 6 : //fin de la recherche
				list.setMultipleMode(false) ;
				B1.setLabel("Indexer l'ordinateur") ;
				B1.setActionCommand("getvol") ;
		}
		mode = md ;
	}
	public void sourceIndex () { // obtenir la list des volumes dans la list
		setMode(2) ;
		listvol = getVolumes() ;
		for (int i = 0 ; i < listvol.length ; i++) {
			list.addItem(listvol[i]) ; //met dans la list tous les volumes
		}
	}
	public void cibleIndex() { //met dans la list les fichiers d'index déja créer
		listvol = list.getSelectedItems() ; //enregistrer les volumes selectionner pour l'indextation
		setMode(3) ;
		list.addItem("Fichier par défault(index" + extension + ")") ; //item fichier par défault
		fichierExtension() ;
	}
	public void fichierExtension() {
		String[] listfichier = dossierIndex.list() ; //demande la list du dossier des index
		for (int i = 0 ; i < listfichier.length ; i++) {
			if (listfichier[i].endsWith(extension)) {
				list.addItem(listfichier[i]) ; //propose les fichiers terminé par l'extension des index
			}
		}
	}
	public void execIndex () { //lance l'indextation avec les paramètre régler précédament
		String name = tf.getText() ; //nom pour enregistrer le fichier
		if (! name.endsWith(extension)) name += extension ; //rajoute l'extension si il n'y a pas
		fichierIndex = new File(dossierIndex, name) ; //créer le file du fichier index à créer
		setMode(4) ;
		runThread() ; //lance la boucle d'indextation dans un thread séparé
		//la fin du thread place le mode à 0
	}
	public String [] getVolumes () { // renvoie les noms des volumes montes
		char [] vol = new char [26] ; int count = 0 ; String sep = ":\\" ;
		for (char c = 'B' ; c < '[' ; c ++) { // essaie toutes les lettres de volumes
			if ( (new File (c + sep)).exists() ) vol [count ++] = c ; } 
		String [] ret = new String [count] ;
		for (int pif = 1 ; pif < count ; pif ++) ret [pif] = vol [pif] + sep ;
		ret [0] = "A" + sep ;
		return (ret) ; 
	}
	public void indexdossier (File dir, int j) { //index le dossier et les dossiers contenu en se rappelant
		try {
			String[] list = dir.list() ;
			int len = list.length ;
			for (int i = 0 ;(tourne) && (i < len) ; i++) {
				File F = new File(dir,list[i]) ;
				boolean b = F.isDirectory() ;
				traiteDonnées(F,j,b) ;
				if (b) {
					indexdossier(F,j+1) ;
				}
			}
		}
		catch (Exception e) {
			if (e.getMessage() == null) erreur = 2 ;
			else erreur++ ;
		}
	}	
	public void traiteDonnées(File F, int j, boolean b) { //écrit les donner récolter dans le fichier
		for (; j >0 ; j--) { //écrit le nbr de tabu en raport avec l'implementation
			PS.print('\t') ;
		}
		PS.print(F.getName()) ;
		if (b) PS.println('\\') ;
		else PS.println() ;
	}
	public void Fermer() { //créer si un jour y'a besoin de faire un truc avant de quitter
		if (tourne) {
			exit = true ;
			tourne = false ;
		}
		System.exit(0) ;
	}
    public void windowClosing (WindowEvent e) { 
            Fermer () ; }
    public void windowClosed (WindowEvent e) { }
    public void windowActivated (WindowEvent e) { }
    public void windowDeactivated (WindowEvent e) { }
    public void windowIconified (WindowEvent e) { }
    public void windowDeiconified (WindowEvent e) { }
    public void windowOpened (WindowEvent e) { }
}

Conclusion :


Bugs : je n'en connais pas mais je trouve le logiciel pas très pratique à utiliser.
Les composants sont mal ranger (encors en teste) mais sa va venir.
Prochaine mise à jour dans une ou deux semaine.
Commentaire bienvenu.

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
2
Date d'inscription
samedi 19 juin 2010
Statut
Membre
Dernière intervention
9 juillet 2012

Salut,
j' ai essai d’exécuter ton programme mais j'ai pas réussit.
voici l'erreur : impossible de trouver la classe principale ou n’existe pas.
merci de m'aider.
Messages postés
5365
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
12 août 2021
111
Salut,

amateur_java > utilise un JOptionpane atu met ton contenu dedans comme ca tu n'aura que la croix de fermeture
et accessoirement il y a un forum pour poser des questions et si tu as des problèmes pour ecrire dessus mentionne le par mail en disant precisement les problèmes de connexion que tu as!


le matheu> "donc préfère le java 1.1.8 plus rapide" c'est faux la version 2 à eu un gros coup de boost concernant le JIT encore plus avec les versions 5 et 6 de java.

pour info la jvm 1.5 d'ibm fait merveilleusement bien tourner une appli swing sur un PPC G3 266Mhz 128M de ram
Messages postés
32
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
6 août 2020

slt
oui c'est ca Frame.setRezisable(false) ;

merci ca fesait un bout de temp que je cherchait un peu partou comment faire;
Sait tu alors comment disabler ou enlever aussi l'autre icone qui reduit la fenetre de mon programme vers le bureau....Ca aussi je ne sais pas faire.

Merci d'avence ;-)
Messages postés
5
Date d'inscription
lundi 5 juin 2006
Statut
Membre
Dernière intervention
18 novembre 2007

Pour enlever l'icone qui set à redimensionner la fenetre :
Frame.setRezisable(false) ;

Préçision : je programme en 1.1.8 et non en java 2.
On me m'a pas appris le java 2 car celui qui m'a lancer n'a que des vieux ordi (moi aussi)et donc préfère le java 1.1.8 plus rapide. J'utilise seulement les awt car les swing n'éxiste pas en java 1.

Merçi à Twinuts pour cette grande aide.
Je vait essayer de passer en Unicode.
L'ouverture d'un fichier est programmmer que pour win 95, NT et bientot Mac mais il est vrai que le JFileChooser serait bien pratique. Existe t-il un équivalent en java 1 ? Je vait chercher (c'est pas FileChooser en tout cas).
la Méthode listRoots() de la class File n'éxiste pas en java 1 (très dommage).
Je vait essayer de respecter les normes pour les noms mais j'ai beaucoup de mal...

Peut-être je ferait 2 version (une pour le java 1 (pour un copain) et une pour le java 2) mais il faudrait encors que le serveur me réponde quand je veux télécharger je J2SE 1.5...

Bon je vait modifié tous ça...
Messages postés
5365
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
12 août 2021
111
Salut,

Bon je n'ai pas encore lu tout le code mais deja à ce que j'en vois c'est un peut le bazar :P

quelques petites precisition concerant les regles de nomage java :
une classe commence par une majuscule et chaque mot qui la compose aussi exemple : MaClassAMoi.
une methode commence par une minuscule et chaque nouveau mot par une majuscule exemple : setUnTruc(....)
une variable à le meme comportement qu'une methode soit : maVariable
une constante(final) est en majuscule et chaque nouveau mot separé d'un '_' exemple : final int MA_CONSTANTE = 1

Concerant le code de ce que j'en vois je le trouve super lourd, tu ferais mieux d'utiliser les composants swing plutot qu'awt, de plus l'utilisation des layout t'eviterais d'avoir un positionnement barbare à coup de setBounds, enfin tu devrais séparer dans une autre classe les actions afin d'épurer ton code et de le rendre plus lisible.

maintenant concernant les accents tu les cherche en brute de forme exemple : 'é' hors je ne le dirais jamais assez cette methode n'est absolumement pas portable au niveau du code exemple si tu est en UTF-8 et que tu met s ton code java sur un system en ISO ba la ton 'é' devient '?' ou je ne sais quel autre merdouille, la solution la plus simple serait de cheque le caractere sous sa forme unicode soit :

switch (c) {
case '\u00e9' :
case '\u00e8' :
case '\u00ea' :
case '\u00eb' : SB.append('e') ; break ;
case '\u00e0' : SB.append('a') ; break ;
case '\u00e7' : SB.append('c') ; break ;
}

voici le lien d'un applet java qui propose une liste des caractères et leurs équivalent :
http://mindprod.com/applets/unicode.html



Quand tu fais :
public void ouvrirPath(String path); je suppose que c'est pour ouvrir l'explorateur crosoft, c'est bien, c'est beau mais tu pourrais faire autrement avec un JFileChooser(swing offre plus de composants qu'awt) qui peut aussi te permettre de selectionner des repertoire , et ainsi t'eviter de brider ton application à windows


concernant getVolume oublie cette methode et utilise File.listRoots qui te renvoit un tableau de file des different devices root (A:, C:, D: ou encore / pour linux), de plus portable:
for(File f : File.listRoots())//syntax 1.5
System.out.println(f);

sinon qd meme mise à part c'est petites choses pour un début c'est pas trop mal
Afficher les 6 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.