La classe <javaClass class="java.io.File" show="full"/> fournit la méthode static <javaMethode class="java.io.File" methode="listRoots()" show="full"/>. Sous Windows, le résultat est la liste des lecteurs logiques ( a:/, c:/, d:/ ), sous Unix, le résultat se limite à la seule racine système.
Cet exemple effectue un parcours récursif d'une arborescence de fichiers et affiche (sur la sortie standard) la liste de tous les fichiers contenus dans le répertoire et ses sous-répertoires.
publicstaticvoid listeRepertoire ( File repertoire )System.out.println ( repertoire.getAbsolutePath());if ( repertoire.isDirectory ( ) )File[] list = repertoire.listFiles();for ( int i = 0; i < list.length; i++)<comment>Appel récursif sur les sous-répertoires</comment>listeRepertoire( list[i]);
Attention : cet algorithme ne fonctionne pas correctement avec une arborescence cyclique sous Unix !
L'Api ne fournissant pas de solution clé en main pour la copie de fichier, voila un bout de code qui devrait fonctionner.
<comment_javadoc>copie le fichier source dans le fichier resultatretourne vrai si ca reussit</comment_javadoc>publicstaticboolean copier( File source, File destination )boolean resultat = false;<comment>Declaration des flux</comment>java.io.FileInputStream sourceFile=null;java.io.FileOutputStream destinationFile=null;try<comment>Création du fichier :</comment>destination.createNewFile();<comment>Ouverture des flux</comment>sourceFile = new java.io.FileInputStream(source);destinationFile = new java.io.FileOutputStream(destination);<comment>Lecture par segment de 0.5Mo</comment>byte buffer[]=newbyte[512*1024];int nbLecture;while( (nbLecture = sourceFile.read(buffer)) != -1 )destinationFile.write(buffer, 0, nbLecture);<comment>Copie réussie</comment>resultat = true;catch( java.io.FileNotFoundException f )catch( java.io.IOException e )finally<comment>Quoi qu'il arrive, on ferme les flux</comment>trysourceFile.close();catch(Exception e) { }trydestinationFile.close();catch(Exception e) { }return( resultat );
Déplacer un fichier
On n'a vu que le déplacement d'un fichier pouvait être fait grâce à la méthode <javaMethode methode="renameTo(java.io.File)" class="java.io.File" /> de la classe <javaClass class="java.io.File" /> ( voir ici ) Mais cette solution n'est valable que pour des déplacements à l'intérieur d'un disque physique... On va donc utilisé l'algorithme de copie lorsque le renommage ne suffit pas :
publicstaticboolean deplacer(File source,File destination)if( !destination.existe() )<comment>On essaye avec renameTo</comment>boolean result = source.renameTo(destination);if( !result )<comment>On essaye de copier</comment>result = true;result &= copier(source,destination);result &= source.delete();return(result);else<comment>Si le fichier destination existe, on annule ...</comment>return(false);
La suppression des fichiers et des répertoires vides est effectuée grâce à la méthode <javaMethode methode="delete()" class="java.io.File" /> de la classe <javaClass class="java.io.File" />. Un booléen en résultat indique si la suppression a réussi (cause d'échec : Fichier inexistant; Fichier en lecture seul; Le fichier est ouvert par une application ou par le système; Flux ouvert sur le fichier; etc...).
Supprimer un repertoire non-vide :
L'Api de base ne permet pas de supprimer un repertoire contenant des fichiers, il faut donc supprimer à la main tous les fichiers du repertoire avant !
La méthode <javaMethode methode="renameTo(java.io.File)" class="java.io.File" /> de la classe <javaClass class="java.io.File" /> permet très facilement de renommer un fichier. De plus, si le répertoire destination est différent du répertoire source, le fichier sera déplacé. (ATTENTION : le déplacement n'est effectué que si la source et la destination sont sur le même disque physique, sinon une copie de fichier est nécessaire)
File source = new File("mon fichier");File destination = new File("mon fichier renommé");source.renameTo(destination);
Un fichier temporaire est un fichier qui sera créé dans le répertoire temporaire du système et qui sera automatiquement supprimé à la fin de l'application (si la JVM quitte correctement).
Aucune solution n'est disponible pour connaître la date de création d'un fichier. Certains systèmes comme Linux ne fournissant pas cette information, aucun solution portable n'est possible.
Date de la dernière modification :
Là, en revanche, aucun problème, la méthode <javaMethode methode="lastModified()" class="java.io.File"/> de la classe <javaClass class="java.io.File"/> est disponible.
Date dateModification = new Date(monFichier.lastModified());
Aucune solution n'est pleinement portable, donc aucune solution pure Java.
JConfig
JConfig est une bibliothèque supplémentaire qui est lié à du code natif disponible pour plusieurs plateformes. Elle permet d'accéder à cette information, ainsi que beaucoup d'autre choses. http://www.tolstoy.com/samizdat/jconfig.html
Les différents systèmes d'exploitation ne gèrent pas les arborescences de fichier de la même façon. Le monde Windows associe les périphériques physiques à des lettres de lecteur, le monde Unix utilise un seul répertoire racine. De plus, les séparateurs de fichier ne sont pas les mêmes (respectivement '\' et '/'). Tout ceci doit être analysé afin d'assurer la portabilité de l'application. Heureusement Java fournit tous les outils pour localiser efficacement les fichiers en gardant toute l'indépendance vis à vis du système d'exploitation.
Le plus important est de ne jamais utiliser directement de séparateur de fichier mais d'utiliser la constante définie en fonction du systeme dans la classe <javaClass class="java.io.File" />.
Ce document issu de http://www.developpez.com est soumis à la licence GNU FDL traduit en français ici.
Permission vous est donnée de distribuer, modifier des copies de cette page tant que cette note apparaît clairement.