Как найти последний измененный файл в каталоге в java?
Как найти последний измененный файл в каталоге на Java?
Ответ 1
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;
}
Ответ 2
Объедините эти два:
- Вы можете получить последнее измененное время файла с помощью
File.lastModified()
. - Чтобы перечислить все файлы в каталоге, используйте
File.listFiles()
.
Обратите внимание, что в Java объект java.io.File
используется как для каталогов, так и для файлов.
Ответ 3
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
Вы можете получить время последней модификации с помощью метода File.lastModified(). Моим предлагаемым решением было бы реализовать пользовательский Компаратор, который сортирует в 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, возможно, быстрее, если вам нужен только последний файл. С другой стороны, это может быть полезно, если вам нужно сделать что-то более сложное.
Ответ 5
Ваша проблема аналогична: Как получить только 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 является последним измененным файлом.
Ответ 6
Компаратор в решении Эмиля был бы таким же чистым
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
может привести к неожиданным результатам.
Ответ 7
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());
}
}
Ответ 8
Предположим, что переменная thePath
содержит каталог, который мы хотим найти, следующий фрагмент возвращает последний измененный файл внутри него:
Files.walk(thePath)
.sorted((f1, f2) -> -(int)(f1.toFile().lastModified() - f2.toFile().lastModified()))
.skip(1)
.findFirst()
Что это делает:
- сначала отсортируйте файлы по времени последнего изменения в обратном порядке,
- затем пропустите сам каталог,
- и, наконец, взять первый элемент в потоке (который является последним измененным).
Ответ 9
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);
}
}