web-dev-qa-db-fra.com

Comment trouver le dernier fichier modifié dans un répertoire Java?

Comment trouver le dernier fichier modifié dans un répertoire java?

22
jumar
private File getLatestFilefromDir(String dirPath){
    File dir = new File(dirPath);
    File[] files = dir.listFiles();
    if (files == null || files.length == 0) {
        return null;
    }

    File lastModifiedFile = files[0];
    for (int i = 1; i < files.length; i++) {
       if (lastModifiedFile.lastModified() < files[i].lastModified()) {
           lastModifiedFile = files[i];
       }
    }
    return lastModifiedFile;
}
44
Bozho

Combinez ces deux:

  1. Vous pouvez obtenir la dernière heure de modification d'un fichier à l'aide de File.lastModified() .
  2. Pour répertorier tous les fichiers d’un répertoire, utilisez File.listFiles() .

Notez qu'en Java, l'objet Java.io.File est utilisé à la fois pour les répertoires et les fichiers.

8
matt b
import org.Apache.commons.io.comparator.LastModifiedFileComparator;
import org.Apache.commons.io.filefilter.WildcardFileFilter;

...
...

/* Get the newest file for a specific extension */
public File getTheNewestFile(String filePath, String ext) {
    File theNewestFile = null;
    File dir = new File(filePath);
    FileFilter fileFilter = new WildcardFileFilter("*." + ext);
    File[] files = dir.listFiles(fileFilter);

    if (files.length > 0) {
        /** The newest file comes first **/
        Arrays.sort(files, LastModifiedFileComparator.LASTMODIFIED_REVERSE);
        theNewestFile = files[0]
    }

    return theNewestFile;
}

Cela fonctionne très bien pour moi

6
John Jintire

Vous pouvez récupérer l'heure de la dernière modification à l'aide de la méthode File.lastModified (). Ma solution suggérée serait d'implémenter un comparateur personnalisé qui trie dans l'ordre lastModified () et insère tous les fichiers du répertoire dans un TreeSet qui trie à l'aide de ce comparateur.

Exemple non testé:

SortedSet<File> modificationOrder = new TreeSet<File>(new Comparator<File>() {
    public int compare(File a, File b) {
        return (int) (a.lastModified() - b.lastModified());
    }
});

for (File file : myDir.listFiles()) {
    modificationOrder.add(file);
}

File last = modificationOrder.last();

La solution suggérée par Bozho est probablement plus rapide si vous n’avez besoin que du dernier fichier. D'un autre côté, cela peut être utile si vous devez faire quelque chose de plus compliqué.

4
Emil H

Votre problème est similaire à: Comment obtenir seulement les 10 derniers fichiers modifiés du répertoire en utilisant Java?

Il suffit de changer le code de filtre pour n’avoir qu’un seul fichier et la méthode accept devrait simplement comparer les deux horodatages. 

Code non testé:

     class TopFileFilter implements FileFilter {

        File topFile;

        public boolean accept(File newF) {
            if(topFile == null)
                topFile = newF;
            else if(newF.lastModified()>topFile.lastModified())
                topFile = newF;
            return false;
        }

    }

Maintenant, appelez dir.listFiles avec une instance de ce filtre en argument. À la fin, le fichier filter.topFile est le dernier fichier modifié.

2
rahulmohan

Java 8

Optional<Path> findLastModifiedFile(Path directory) throws IOException {
    return Files.list(directory)
            .max(this::compareLastModified);
}

int compareLastModified(Path p1, Path p2) {
    try {
        return Files.getLastModifiedTime(p1).compareTo(Files.getLastModifiedTime(p2));
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}
1
Bax

Le comparateur dans la solution d'Emil serait plus propre de cette façon

public int compare(File a, File b) {
    if ((a.lastModified() < b.lastModified())) {
        return 1;
    } else if ((a.lastModified() > b.lastModified())) {
        return -1;
    } 
    return 0;
}

Transtyper (a.lastModified() - b.lastModified()) en int peut produire des résultats inattendus.

1
    String path = "C:\\Work\\Input\\";

    File dir = new File(path);
    File[] files = dir.listFiles();

    Arrays.sort(files, new Comparator<File>() {
        public int compare(File f1, File f2) {
            return Long.valueOf(f2.lastModified()).compareTo(
                    f1.lastModified());
        }
    });

    for (int index = 0; index < files.length; index++) {
        // Print out the name of files in the directory
        System.out.println(files[index].getName());
    }

}
1
Praneeth

Supposons que la variable thePath contienne le répertoire dans lequel nous souhaitons effectuer la recherche, l'extrait de code suivant renvoie le dernier fichier modifié qu'il contient:

Files.walk(thePath)
.sorted((f1, f2) -> -(int)(f1.toFile().lastModified() - f2.toFile().lastModified()))
.skip(1)
.findFirst()

Ce qu’il fait, c’est d’abord, trier les fichiers en fonction de la date de dernière modification en sens inverse, puis ignorer le répertoire lui-même et enfin prendre le premier élément du flux (qui est le dernier modifié).

0
MarcosNC