2013-03-18 4 views
0

Мне нужна программа java, которая по запросу возвращает список недавно добавленных файлов в каталог. Мое определение нового файла - это тот, который не был, наконец, проверкой/сканированием каталога.Java: получить список новых файлов из каталога

Я знаю, что есть библиотеки, такие как JNotify и служба просмотра каталога java http://docs.oracle.com/javase/tutorial/essential/io/notification.html. Однако в моем понимании эти библиотеки реализуют слушатели, которые смотрят каталог и уведомляют, как только происходит какое-либо событие файла (добавление, удаление, удаление и т. Д.). Но мне нужен метод, который по запросу возвращает список новых добавленных файлов в каталог.

+1

Добавленный по сравнению с чем? Создана с момента последнего запуска? Что именно вы подразумеваете под «недавно добавленным»? – david99world

+0

@ david99world, как я уже сказал, «недавно добавленный - это тот, который не был на последнем вызове, т.е. проверка/сканирование каталога – Nadeem

ответ

0

Вы можете сохранить список имен файлов и проверить, что против новых файлов

+2

Не нужно поддерживать список файлов. Вы можете просто сохранить метку времени, когда был сделан последний запрос, а затем вернуть список файлов, более поздних, чем метка времени. – Manish

+0

@Manish да, это хорошая идея –

1

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

Что-то вроде:

public List<File> getNewFiles(Date lastRequestedDate) 
{ 
//Iterate the directory for files newer than the date passed in as parameter 
} 
+0

Маниш спасибо за идею, на самом деле я искал ссылку на некоторые уже выполненные работы и повторно использовал ее для себя. Повторное использование объявлений - хорошая практика. Но если я не получу его вовремя, тогда процесс поиска может занять больше времени, чем он экономит. :) – Nadeem

1

Существуют различные подходы.

Подход один: Дата создания файла

Вы можете перечислить все файлы и проверить Отметка времени создания каждого файла. Там уже есть deep discussion on this topic. Просто проверьте, больше ли отметка времени, чем временная метка, которую вы сохранили, когда вы в последний раз проверяли каталог.

подход два: Создание и ведение списка файлов

Если вы можете позволить себе память и время, создать список файлов в каталоге. Перейдите по каталогу и добавьте все файлы, которых еще нет в списке, в другой список. Сделайте все, что вам нужно, и добавьте их в свой основной список.

Вы также должны сериализовать свой основной список и сохранить его на диске после каждой успешной проверки и работы с файлами.

0

Я бы посоветовал вам обратиться в службу просмотра Java-каталогов. Должно быть довольно быстро реализовать службу часов. Пусть он работает в фоновом режиме; он будет держать события в очереди - add, remove, delete - как они происходят. Всякий раз, когда ваш по требованию API нужен список файлов, которые были добавлены, вам просто нужно сделать следующее:

  • опроса всех событий, которые были поставлены в очередь до сих пор
  • итерации над ними, обратите внимание на add типы событий и создать список должны быть возвращены
  • четких событий, которые вы опрошенные так, что они не появляются в следующем опросе (есть reset API, чтобы сделать это)

преимущества этого подхода будет:

  1. Меньше проблем: вам придется сканировать каталог и отслеживать добавленный файл; Java будет делать это для вас, поэтому в этой части не будет ошибок.
  2. Меньше потребления памяти: При использовании подхода с меткой времени вы получите файлы, которые были изменены с момента последнего сканирования, поэтому вам нужно будет сохранить список всех файлов, с которыми вы столкнулись, для идентификации добавленного файла. Но с помощью службы просмотра каталогов вам придется поддерживать любую такую ​​структуру данных.
  3. Лучшая производительность: Во время выполнения метода по требованию вы не будете выполнять сопоставление каталогов или сопоставление имен файлов; вы просто перебираете уже запущенные события и создаете возвращаемое значение.
0

Вы можете поддерживать указатель файла в отдельных файлах .. и каждый раз, когда вам нужен новый/старый файл, вы можете перейти ниже.

package test; 

import java.io.File; 
import java.io.FileFilter; 
import java.io.IOException; 
import java.util.Arrays; 
import java.util.Date; 

import org.apache.commons.io.comparator.LastModifiedFileComparator; 
import org.apache.commons.io.filefilter.AgeFileFilter; 

public class AgeFileFilterTest { 

    public static void main(String[] args) throws IOException { 
    String directoryPath = "/home/vikas"; 
    String fileName = "fileName"; 
    File directory = new File(directoryPath); 


    File[] files = directory.listFiles(); 
    System.out.println("\nBefore "); 
    displayFiles(directory, new AgeFileFilter(new File(directoryPath+FileName) , true)); 
    System.out.println("\nAfter "); 
    displayFiles(directory, new AgeFileFilter(new File(directoryPath+FileName),false)); 

} 

public static void displayFiles(File directory, FileFilter fileFilter) { 
    File[] files = directory.listFiles(fileFilter); 
    Arrays.sort(files, LastModifiedFileComparator.LASTMODIFIED_COMPARATOR); 
    for (File file : files) { 
     Date lastMod = new Date(file.lastModified()); 
     System.out.println("File: " + file.getName() + ", Date: " + lastMod + ""); 
    } 
} 

}

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