Как найти последний измененный файл в каталоге на Java? - PullRequest
22 голосов
/ 14 января 2010

Как мне найти последний измененный файл в каталоге в Java?

Ответы [ 9 ]

44 голосов
/ 14 января 2010
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;
}
8 голосов
/ 14 января 2010

Объедините эти два:

  1. Время последнего изменения файла можно получить с помощью File.lastModified().
  2. Чтобы получить список всех файлов в каталоге, используйте File.listFiles().

Обратите внимание, что в Java объект java.io.File используется как для каталогов, так и для файлов.

6 голосов
/ 09 сентября 2012
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;
}

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

4 голосов
/ 14 января 2010

Вы можете получить время последней модификации, используя метод File.lastModified (). Мое предлагаемое решение состояло бы в том, чтобы реализовать пользовательский Comparator, который сортирует в lastModified () - порядке и вставить все файлы в каталоге в TreeSet, который сортирует, используя этот компаратор.

Не проверенный пример:

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

Решение, предложенное Bozho, вероятно, быстрее, если вам нужен только последний файл. С другой стороны, это может быть полезно, если вам нужно сделать что-то более сложное.

2 голосов
/ 16 февраля 2011

Ваша проблема похожа на: Как получить только 10 последних измененных файлов из каталога с использованием Java?

Просто измените код фильтра, чтобы иметь только один файл, и метод accept должен просто сравнить две метки времени.

Непроверенный код:

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

    }

Теперь вызовите dir.listFiles с экземпляром этого фильтра в качестве аргумента. В конце filter.topFile является последним измененным файлом.

1 голос
/ 20 марта 2018

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);
    }
}
1 голос
/ 28 апреля 2017

Предположим, что переменная thePath содержит каталог, который мы хотим найти, следующий фрагмент возвращает последний измененный файл внутри него:

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

Что он делает:

  • сначала отсортируйте файлы по времени последнего изменения в обратном порядке,
  • затем пропустите сам каталог,
  • и, наконец, возьмите первый элемент в потоке (который является последним измененным).
1 голос
/ 05 июня 2014
    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());
    }

}
1 голос
/ 14 января 2010

Компаратор в решении Эмиля будет таким чище

public int compare(File a, File b) {
    if ((a.lastModified() < b.lastModified())) {
        return 1;
    } else if ((a.lastModified() > b.lastModified())) {
        return -1;
    } 
    return 0;
}

Приведение (a.lastModified() - b.lastModified()) к int может привести к неожиданным результатам.

...