2010-01-14 3 views
21

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

+0

Вы спрашиваете, как сортировать по последнему измененному времени? Или вам нужен алгоритм, который найдет максимум последнего измененного времени? Они кажутся очевидными решениями; что вы действительно просите? –

ответ

38
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; 
} 
+0

Я думал, что использовать пользовательский компаратор будет чище, но этот способ выполняется быстрее. –

+4

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

+0

нет. тем больше длинное значение, чем позже файл будет изменен. Если это было причиной нисходящего потока, не стесняйтесь его отменить;) – Bozho

8

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

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

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

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, вероятно, быстрее, если вам нужен только последний файл. С другой стороны, это может быть полезно, если вам нужно сделать что-то более сложное.

0

Компаратор в растворе Эмиля будет чище этот путь

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 может привести к неожиданным результатам.

1

Ваша задача аналогична: How to get only 10 last modified files from directory using Java?

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

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

 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 является последним измененным файлом.

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

Это отлично работает для меня

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

} 
0

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

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

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

+0

Хотя этот фрагмент кода может быть решением, [включая объяснение] (// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин вашего предложения кода. – derM

Смежные вопросы