Comment trouver le dernier fichier modifié dans un répertoire java?
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;
}
Combinez ces deux:
File.lastModified()
.File.listFiles()
.Notez qu'en Java, l'objet Java.io.File
est utilisé à la fois pour les répertoires et les fichiers.
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
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é.
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é.
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);
}
}
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.
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());
}
}
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é).