2010-01-14 14 views
21

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

+0

Demandez-vous comment trier par heure de dernière modification? Ou voulez-vous un algorithme qui trouve le maximum de la dernière fois modifié? Cela semble être une solution évidente. qu'est-ce que vous demandez vraiment? –

Répondre

38
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; 
} 
+0

Je pensais qu'il serait plus propre d'utiliser un comparateur personnalisé, mais de cette façon, c'est plus rapide. –

+4

en utilisant un comparateur est une bonne pratique, mais ce n'est qu'une tâche simple et pourrait s'en passer. – Bozho

+0

no. plus la valeur longue est grande, plus le fichier est modifié ultérieurement. Si cela était la raison de la downvote, n'hésitez pas à l'annuler;) – Bozho

8

combiner ces deux:

  1. Vous pouvez obtenir la dernière modification d'un fichier en utilisant File.lastModified(). Pour afficher la liste de tous les fichiers d'un répertoire, utilisez File.listFiles().

Notez que dans Java l'objet java.io.File est utilisé pour les répertoires et les fichiers.

4

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 lastModified() - order et insère tous les fichiers dans le répertoire dans un TreeSet qui trie en utilisant ce comparateur.

exemple Untested:

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 proposée par Bozho est probablement plus rapide si vous avez seulement besoin du dernier fichier. D'un autre côté, cela peut être utile si vous avez besoin de faire quelque chose de plus compliqué.

0

Le comparateur dans la solution de 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; 
} 

casting (a.lastModified() - b.lastModified()) à int peut produire des résultats inattendus.

1

Votre problème est similaire à: How to get only 10 last modified files from directory using Java?

Il suffit de changer le code de filtre pour avoir un seul fichier et la méthode accept doit simplement comparer les deux horodateurs.

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, dir.listFiles d'appel avec une instance de ce filtre comme argument. À la fin, filter.topFile est le dernier fichier modifié.

5
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

0
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()); 
    } 

} 
0

Supposons que la thePath variable contient le répertoire que nous voulons rechercher, l'extrait suivant retourne le dernier fichier modifié à l'intérieur:

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

Ce qu'il fait est, d'abord trier les fichiers par leur dernière heure de modification à l'envers, puis ignorer le répertoire lui-même, et enfin prendre le premier élément dans le flux (qui est le dernier modifié un).

+0

Bien que cet extrait de code puisse être la solution, [y compris une explication] (// meta.stackexchange.com/questions/114762/explaining-entirely- code-based-answers) aide vraiment à améliorer la qualité de votre message. Rappelez-vous que vous répondez à la question pour les lecteurs dans le futur, et que ces personnes pourraient ne pas connaître les raisons de votre suggestion de code. – derM

Questions connexes