Java - получить новейший файл в каталоге?

У кого-нибудь есть фрагмент Java, который может вернуть самый новый файл в каталоге (или знание библиотеки, которая упрощает такие вещи)?


person Community    schedule 13.11.2008    source источник


Ответы (8)


Следующий код возвращает последний измененный файл или папку:

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;
}

Обратите внимание, что для этого требуется Java 8 или новее из-за лямбда-выражения.

person José Leal    schedule 13.11.2008
comment
Не забудьте проверить, что listFiles() не возвращает null. - person Zach Scrivena; 13.11.2008

В 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
}     
person Almaz    schedule 17.06.2015
comment
Пожалуйста, не просто сбрасывайте свой код. Объясните ход ваших мыслей, чтобы мы могли лучше понять ваш ответ. Спасибо. - person Cthulhu; 17.06.2015
comment
Что произойдет, если разница между двумя метками времени последнего изменения больше, чем Integer.MAX_VALUE? - person Kiet Tran; 31.08.2015
comment
В вашем примере есть опечатка: isPresented() должно быть isPresent() - person nilsmagnus; 17.12.2015
comment
возможно ли это без загрузки полного списка файлов? В случаях, когда каталог слишком велик. - person Ravi Samani; 20.10.2020

Это прекрасно работает для меня:

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;
}
person John Jintire    schedule 09.09.2012
comment
да ладно, вам не нужно СОРТИРОВАТЬ массив, чтобы получить минимальное значение! - person andrej; 27.11.2013
comment
Может быть, идеально, но не быстро - person mes; 25.11.2014
comment
Что, если мы не будем обновлять каталог, это будет каждый раз давать один и тот же результат? - person Dileep; 31.08.2016

Что-то типа:

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 ));
    }
}
person OscarRyz    schedule 13.11.2008
comment
Это довольно шатко, чтобы принудительно вызвать ClassCastException в случае, отличном от файла, вместо, скажем, утверждения instanceof. - person Chris Conway; 13.11.2008
comment
Вы не получите не-файл из массива, возвращаемого File.listFiles(); - person OscarRyz; 13.11.2008
comment
да ладно, вам не нужно СОРТИРОВАТЬ массив, чтобы получить минимальное значение! - person andrej; 27.11.2013
comment
Почему бы вам не использовать новый Comparator‹File›()? Это позволяет избежать приведения и дополнительной функции. - person ; 12.08.2016

Вот небольшая модификация кода Хосе, которая гарантирует, что в папке есть хотя бы 1 файл. Отлично работает в моем приложении!

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;
}
person Asheron    schedule 13.07.2018

Это вернет самый последний созданный файл, я сделал это, потому что, когда вы создаете файл в некоторых ситуациях, он не всегда может иметь правильную дату изменения.

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;
}
person theeman05    schedule 07.04.2019

Этот код работает для меня хорошо:

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
person SaurabhGuptaAricent    schedule 31.05.2019

person    schedule
comment
ребята, вы можете использовать этот код для получения последнего измененного файла. - person Prasanth V; 16.08.2017