How do I find the last modified file in a directory in java?
-
Are you asking how to sort by last modified time? Or do you want an algorithm that finds the maximum of last modified time? These seem like obvious solutions; what are you really asking for? – S.Lott Jan 14 '10 at 14:25
9 Answers
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;
}

- 7,326
- 3
- 41
- 61

- 588,226
- 146
- 1,060
- 1,140
-
I'd thought it would be cleaner to use a custom comparator, but this way is faster. – Steve B. Jan 14 '10 at 14:28
-
4using a comparator is a good practice, but this is just a simple task and could go without it. – Bozho Jan 14 '10 at 14:31
-
no. the greater the long value is, the later the file is modified. If that was the reason for the downvote, feel free to undo it ;) – Bozho Jan 14 '10 at 14:36
-
@Bozho - using a comparator is no more "good practice", than using the `int` type is "good practice". The strongest you can say is that comparators are a good (partial) solution for many programming problems. – Stephen C Jan 14 '10 at 15:03
-
2You could get an index out of bounds if the directory is empty. You should not assign files[0] to lastModifiedFile outside of the loop. – Steve Kuo Jan 14 '10 at 18:42
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;
}
This works great for me

- 489
- 5
- 4
Combine these two:
- You can get the last modified time of a File using
File.lastModified()
. - To list all of the files in a directory, use
File.listFiles()
.
Note that in Java the java.io.File
object is used for both directories and files.

- 138,234
- 66
- 282
- 345
You can retrieve the time of the last modification using the File.lastModified() method. My suggested solution would be to implement a custom Comparator that sorts in lastModified()-order and insert all the Files in the directory in a TreeSet that sorts using this comparator.
Untested example:
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();
The solution suggested by Bozho is probably faster if you only need the last file. On the other hand, this might be useful if you need to do something more complicated.

- 2,853
- 4
- 33
- 62

- 39,840
- 10
- 78
- 97
Your problem is similar to: How to get only 10 last modified files from directory using Java?
Just change the filter code to have only one File and the accept method should simply compare the two time stamps.
Untested code:
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;
}
}
Now, call dir.listFiles with an instance of this filter as argument. At the end, the filter.topFile is the last modified file.

- 1
- 1

- 1,285
- 11
- 19
Let's assume that the variable thePath
contains the directory we want to search, the following snippet returns the last modified file inside it:
Files.walk(thePath)
.sorted((f1, f2) -> -(int)(f1.toFile().lastModified() - f2.toFile().lastModified()))
.skip(1)
.findFirst()
What it does is:
- first sort the files by their last modification time in reverse,
- then skip the directory itself,
- and finally take the first element in the stream (which is the last modified one).
-
While this code snippet may be the solution, [including an explanation](//meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) really helps to improve the quality of your post. Remember that you are answering the question for readers in the future, and those people might not know the reasons for your code suggestion. – derM - not here for BOT dreams Apr 27 '17 at 23:17
The comparator in Emil's solution would be cleaner this way
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())
to int
can produce unexpected results.

- 3,157
- 1
- 20
- 17
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());
}
}

- 11
- 1
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);
}
}

- 4,260
- 5
- 43
- 65