У кого-нибудь есть фрагмент Java, который может вернуть самый новый файл в каталоге (или знание библиотеки, которая упрощает такие вещи)?
Java - получить новейший файл в каталоге?
Ответы (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
Не забудьте проверить, что 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
Пожалуйста, не просто сбрасывайте свой код. Объясните ход ваших мыслей, чтобы мы могли лучше понять ваш ответ. Спасибо.
- person Cthulhu; 17.06.2015
Что произойдет, если разница между двумя метками времени последнего изменения больше, чем Integer.MAX_VALUE?
- person Kiet Tran; 31.08.2015
В вашем примере есть опечатка: isPresented() должно быть isPresent()
- person nilsmagnus; 17.12.2015
возможно ли это без загрузки полного списка файлов? В случаях, когда каталог слишком велик.
- 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
да ладно, вам не нужно СОРТИРОВАТЬ массив, чтобы получить минимальное значение!
- person andrej; 27.11.2013
Может быть, идеально, но не быстро
- person mes; 25.11.2014
Что, если мы не будем обновлять каталог, это будет каждый раз давать один и тот же результат?
- 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
Это довольно шатко, чтобы принудительно вызвать ClassCastException в случае, отличном от файла, вместо, скажем, утверждения instanceof.
- person Chris Conway; 13.11.2008
Вы не получите не-файл из массива, возвращаемого File.listFiles();
- person OscarRyz; 13.11.2008
да ладно, вам не нужно СОРТИРОВАТЬ массив, чтобы получить минимальное значение!
- person andrej; 27.11.2013
Почему бы вам не использовать новый 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
ребята, вы можете использовать этот код для получения последнего измененного файла.
- person Prasanth V; 16.08.2017