Mélangeur d'images pour les cadres photos (2011)

J'ai développé ce programme pour mon cadre photo afin qu'il affiche mes photos dans un ordre aléatoire.

Le programme est écrit en Java. Il prend le contenu d'un répertoire et des sous répertoires et renomme tous les fichiers dans un ordre aléatoire : Ainsi le cadre photo prend les photos dans le bon ordre, c'est à dire dans l'ordre aléatoire indiqué.

package com.emmguyot.randomize;

import java.io.File;
import java.io.FilenameFilter;
import java.util.Comparator;
import java.util.Date;
import java.util.Random;
import java.util.SortedSet;
import java.util.TreeSet;
import java.util.Vector;

public class RandomizeFiles {

  /**
   * @param args
   */
  public static void main(String[] args) {
    
    File dir;
    if (args.length > 0) {
      dir = new File(args[0]);
    }
    else {
      dir = new File('.');
    }
    if (!dir.isDirectory())
      throw new IllegalArgumentException('no such directory');
    Vector<File> lstFichiers = new Vector<File>();
    File[] fichiers = dir.listFiles(new GraphicsFileFilter());

    // Obtient les fichiers avec ceux de tous les sous répertoires
    lstFichiers = getLstFichiers(lstFichiers, fichiers);
    
    SortedSet<File> lstFichiersTri = new TreeSet<File>(new RandomiseComparateur());
    lstFichiersTri.addAll(lstFichiers);

    int ordre = 0;
    for(File f : lstFichiersTri) {
      String nom = f.getName();
      String nouveauNom = dir.toString() + File.separator + String.format('%08d', ordre) + nom.substring(nom.lastIndexOf('.'));
      System.out.println(nom + ' => ' + nouveauNom);
      f.renameTo(new File(nouveauNom));
      ordre++;
    }
  }

  private static Vector<File> getLstFichiers(Vector<File> lstFichiers, File[] fichiers) {
    for(File fichier : fichiers) {
      
      if (fichier.isDirectory()) {
        File[] fichiers2 = fichier.listFiles(new GraphicsFileFilter());
        lstFichiers = getLstFichiers(lstFichiers, fichiers2);
      }
      else {
        lstFichiers.add(fichier);
      }
    }
    
    return lstFichiers;
  }

  /**
   * accept graphics files and director files (only)
   */
  private static class GraphicsFileFilter implements FilenameFilter {
    public GraphicsFileFilter() {
    }

    final public boolean accept(File dir, String name) {
      String s = name.toLowerCase();
      if (s.endsWith('_s.jpg'))
        return false;
      if (s.endsWith('gif'))
        return true;
      if (s.endsWith('jpg'))
        return true;
      if (s.endsWith('bmp'))
        return true;
      if (s.endsWith('jpeg'))
        return true;
      return (new File(dir, name)).isDirectory();
    }
  }

  /**
   * accept graphics files and director files (only)
   */
  private static class RandomiseComparateur implements Comparator<File> {
    
    private Random rnd;
    
    public RandomiseComparateur() {
      rnd = new Random(new Date().getTime()); 
    }

    @Override
    public int compare(File o1, File o2) {
      
      if (o1.getName().equals(o2.getName()))
        return 0;
      else {
        return rnd.nextInt();
      }
    }
  }
}