2013-04-08 3 views
0

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

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

Я искал его и нашел несколько решений, связанных с listner, к пути, как JNotify, класс FileAlterationObserver вместе с FileAlterationMonitor, но есть около 20 папок, которые мне нужно отслеживать, поэтому я искал любое более простое решение, например, когда я читал отметку файла как обработано (переименовать его и добавить «Обработано» его имени или любому уникальному тексту) и в следующий раз прочитать файлы, которые не отмечены «обработано».

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

Я новичок в Jave, так что я не знаю, является ли это возможно или нет, Так что мой вопрос, могу ли я запросить все имена файлов, которые не заканчиваются на «Обработанные» без перебора всех имен файлов, присутствующих в папке?

Или у кого-нибудь есть другое решение?

ответ

0

Если вы можете изменить имена файлов, то вам будет необходимо переименовать файл в «old_file_name + Processed», а затем обработать только те, которые их имена не заканчиваются обработкой.

+0

Могу ли я запросить все имена файлов, которые не заканчиваются на «Обработанные» без перебора всех имен файлов, находящихся в папке? –

1

После обработки нам нужен файл больше? Кто изменяет файлы? Если это через программу, будет ли эта программа нужна информация о уже обработанных файлах? Когда эта программа собирается изменить файл, переименуйте его снова с file1_processed на file1?
Вы должны подумать об этих случаях использования и многом другом, если вы измените имена файлов (хотя я не знаю, как и когда вы о своей системе, но я чувствовал, что это будет скомпоновано).
Лучше вы просто нас JNotifier, он очень прост в использовании. Используя это, вы можете удалить планировщик. Всякий раз, когда уведомление появляется для определенных файлов (добавлено/изменено и т. Д.), Вы можете фактически обновить базу данных только раз в том, что касается только этого файла, нет необходимости проходить через папки.
Просто убедитесь, что в нескольких случаях вы можете получить несколько уведомлений в JNotifier, например. при добавлении нового файла вы получаете добавление, изменение, при переименовании вы переименовываете, модифицируете. Так что вам нужно позаботиться об этом.
С помощью старого планировщика вы также можете сделать то же самое. вы можете сохранить последнюю обновленную временную метку файла в базе данных. в следующем расписании вы просто проверяете последнюю временную метку, если временная метка новее, затем обрабатывайте ее и повторно обновляйте базу данных.
Также вы можете сделать сочетание JNotify и планировщика. По jnotify вы обновляете измененные/измененные имена файлов в некотором ADT, планировщик может выполнять поиск внутри ADT, получает путь измененных файлов и обновляет эти файлы только в базе данных.


Вы можете воспользоваться помощью из приведенного ниже примера,

public void register(String path) throws JNotifyException { 
     int mask = JNotify.FILE_CREATED | JNotify.FILE_DELETED 
       | JNotify.FILE_MODIFIED | JNotify.FILE_RENAMED; 
     boolean watchSubtree = true; 
     if (pathSet.contains(path)) { 
      return; 
     } 
     System.out.println("Adding watch for: " + path); 
     JNotify.addWatch(path, mask, watchSubtree, 
       new JNotifyListener() { 

        @Override 
        public void fileCreated(int arg0, String folderName, String fileName) { 
         fileChanged("New object created: " + fileName + " in folder: " + folderName); 

        } 

        @Override 
        public void fileDeleted(int arg0, String folderName, String fileName) { 
         fileChanged(fileName + " deleted in folder: " + folderName); 
        } 

        @Override 
        public void fileModified(int arg0, String folderName, String fileName) { 
//      fileChanged(fileName + " modified in folder: " + folderName); 
        } 

        @Override 
        public void fileRenamed(int arg0, String folderName, String oldFileName, 
          String newFileName) { 
         fileChanged(oldFileName + " renamed to: "+ oldFileName +" in folder: " + folderName); 
        } 
       }); 
    } 

    private void fileChanged(String str){ 
     //your code here 
    } 
+1

После обработки нам больше не нужен этот файл, и нам нужны только недавно созданные файлы, поэтому мне не нужно изменять, удалять действие, но мне нужно отслеживать 20 таких путей, поэтому я должен использовать JNotifier, потому что если он по какой-то причине сбой, то это будет большой интерес –

+0

, если вам не нужен обработанный файл, вы можете просто вывести их из папки и поместить в какую-то папку с архивами. когда ваш поиск программы в исходной папке, он не получает эти обработанные файлы, получает только новые файлы. При этом вам не нужно проверять какое-либо условие, например обработанное или нет, и т. Д. Таким образом, ваша производительность программы и ремонтопригодность будут увеличиваться. –

+0

yup, но перенос их в другую папку означает новую папку на сервере, я не уверен, что мы можем это сделать, поскольку архивирование - это любое автоматическое управление m job, которое архивирует 1 месяц старые файлы. –

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