Does anybody have a snippet of Java that can return the newest file in a directory (or knowledge of a library that simplifies this sort of thing)?
Asked
Active
Viewed 1.2e+01k times
9 Answers
74
The following code returns the last modified file or folder:
public static File getLastModified(String directoryFilePath)
{
File directory = new File(directoryFilePath);
File[] files = directory.listFiles(File::isFile);
long lastModifiedTime = Long.MIN_VALUE;
File chosenFile = null;
if (files != null)
{
for (File file : files)
{
if (file.lastModified() > lastModifiedTime)
{
chosenFile = file;
lastModifiedTime = file.lastModified();
}
}
}
return chosenFile;
}
Note that it required Java 8
or newer due to the lambda expression.

BullyWiiPlaza
- 17,329
- 10
- 113
- 185

José Leal
- 7,989
- 9
- 35
- 54
-
5Remember to check that listFiles() doesn't return null. – Zach Scrivena Nov 13 '08 at 02:55
-
Add on more check files != null && files.length > 0 – Shantesh Sindgi Feb 17 '23 at 10:00
41
In Java 8:
Path dir = Paths.get("./path/somewhere"); // specify your directory
Optional<Path> lastFilePath = Files.list(dir) // here we get the stream with full directory listing
.filter(f -> !Files.isDirectory(f)) // exclude subdirectories from listing
.max(Comparator.comparingLong(f -> f.toFile().lastModified())); // finally get the last file using simple comparator by lastModified field
if ( lastFilePath.isPresent() ) // your folder may be empty
{
// do your code here, lastFilePath contains all you need
}

Boris Schegolev
- 3,601
- 5
- 21
- 34

Almaz
- 920
- 11
- 13
-
Please don't just dump your code. Explain your train of thought so we can better understand your answer. Thanks. – Cthulhu Jun 17 '15 at 13:48
-
1What happens if the difference between the two last-modified timestamps is larger than Integer.MAX_VALUE? – Kiet Tran Aug 31 '15 at 00:35
-
There is a typo in your example: isPresented() should be isPresent() – nilsmagnus Dec 17 '15 at 15:13
-
is it possible without loading full files list? In cases when directory is too large. – RaviSam Oct 20 '20 at 11:29
17
This works perfectly fine for me:
import org.apache.commons.io.FileUtils;
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;
}

davidsheldon
- 38,365
- 4
- 27
- 28

John Jintire
- 489
- 5
- 4
-
12
-
-
What if we are not updating the directory it will give the same result every time.? – Dileep Aug 31 '16 at 15:07
2
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;
}

Prasanth V
- 21
- 4
1
Something like:
import java.io.File;
import java.util.Arrays;
import java.util.Comparator;
public class Newest {
public static void main(String[] args) {
File dir = new File("C:\\your\\dir");
File [] files = dir.listFiles();
Arrays.sort(files, new Comparator(){
public int compare(Object o1, Object o2) {
return compare( (File)o1, (File)o2);
}
private int compare( File f1, File f2){
long result = f2.lastModified() - f1.lastModified();
if( result > 0 ){
return 1;
} else if( result < 0 ){
return -1;
} else {
return 0;
}
}
});
System.out.println( Arrays.asList(files ));
}
}

OscarRyz
- 196,001
- 113
- 385
- 569
-
It's kind of wonky to force a ClassCastException in the non-File case, instead of, say, asserting instanceof. – Chris Conway Nov 13 '08 at 01:10
-
1You won't get a non-File from the array returned by File.listFiles(); – OscarRyz Nov 13 '08 at 01:17
-
1
-
Why don't you use new Comparator
()? This avoids the cast and the extra function. – Aug 12 '16 at 10:35
1
public File getLastDownloadedFile() {
File choice = null;
try {
File fl = new File("C:/Users/" + System.getProperty("user.name")
+ "/Downloads/");
File[] files = fl.listFiles(new FileFilter() {
public boolean accept(File file) {
return file.isFile();
}
});
//Sleep to download file if not required can be removed
Thread.sleep(30000);
long lastMod = Long.MIN_VALUE;
for (File file : files) {
if (file.lastModified() > lastMod) {
choice = file;
lastMod = file.lastModified();
}
}
} catch (Exception e) {
System.out.println("Exception while getting the last download file :"
+ e.getMessage());
}
System.out.println("The last downloaded file is " + choice.getPath());
System.out.println("The last downloaded file is " + choice.getPath(),true);
return choice;
}

Tested
- 11
- 2
1
This will return the most recent created file, I made this because when you create a file in some situations, it may not always have the correct modified date.
import java.nio.file.Files;
import java.nio.file.attribute.BasicFileAttributes;
import java.nio.file.attribute.FileTime;
private File lastFileCreated(String dir) {
File fl = new File(dir);
File[] files = fl.listFiles(new FileFilter() {
public boolean accept(File file) {
return true;
}
});
FileTime lastCreated = null;
File choice = null;
for (File file : files) {
BasicFileAttributes attr=null;
try {
attr = Files.readAttributes(file.toPath(), BasicFileAttributes.class);
}catch (Exception e){
System.out.println(e);
}
if(lastCreated ==null)
lastCreated = attr.creationTime();
if (attr!=null&&attr.creationTime().compareTo(lastCreated)==0) {
choice = file;
}
}
return choice;
}

theeman05
- 61
- 1
- 4
0
Here's a small modification to Jose's code which makes sure the folder has at least 1 file in it. Work's great in my app!
public static File lastFileModified(String dir) {
File fl = new File(dir);
File choice = null;
if (fl.listFiles().length>0) {
File[] files = fl.listFiles(new FileFilter() {
public boolean accept(File file) {
return file.isFile();
}
});
long lastMod = Long.MIN_VALUE;
for (File file : files) {
if (file.lastModified() > lastMod) {
choice = file;
lastMod = file.lastModified();
}
}
}
return choice;
}

Asheron
- 33
- 4
0
This code works for me well:
public String pickLatestFileFromDownloads() {
String currentUsersHomeDir = System.getProperty("user.home");
String downloadFolder = currentUsersHomeDir + File.separator + "Downloads" + File.separator;
File dir = new File(downloadFolder);
File[] files = dir.listFiles();
if (files == null || files.length == 0) {
testLogger.info("There is no file in the folder");
}
File lastModifiedFile = files[0];
for (int i = 1; i < files.length; i++) {
if (lastModifiedFile.lastModified() < files[i].lastModified()) {
lastModifiedFile = files[i];
}
}
String k = lastModifiedFile.toString();
System.out.println(lastModifiedFile);
Path p = Paths.get(k);
String file = p.getFileName().toString();
return file;
}
//PostedBy: saurabh Gupta Aricent-provar

howie
- 2,587
- 3
- 27
- 43