Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Java file/directory watcher, Кто использовал? Что лучше? 
:(
    Опции темы
garbuz
Дата 23.12.2008, 23:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 677
Регистрация: 22.1.2008

Репутация: 3
Всего: 11



Необходим некий java file/directory wather, который бы следил за определенным файлом/директорией и файлами внутри нее. Например добавили файл в папку, произошло событие, которое мы потом в каком-то виде можем передать другому классу, ну или что-то того. Проще говоря, надо мониторить некую директорию или файл, на факт создания/удаления/изменения файлов, и в соответствии с каждым событием инициировать то или иное действие.

Кто с такой задачей сталкивался? Что использовал? Какие подводные камни и т.п.
Заранее больше спасибо! smile


PM MAIL   Вверх
v2v
Дата 23.12.2008, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1620
Регистрация: 20.9.2006
Где: Киев

Репутация: 8
Всего: 56



1. Составляешь список файлов/директорий. 
2. Записываешь куда то last modification time для каждого. 
3. Спустя некоторое время повторно сканируешь и инициируешь нужное событие в случае изменения/удаления/добавления...
4. в цикле 2,3 

Задачка на пару часиков ...

Это сообщение отредактировал(а) v2v - 23.12.2008, 23:56


--------------------
PM   Вверх
garbuz
Дата 24.12.2008, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 677
Регистрация: 22.1.2008

Репутация: 3
Всего: 11



Этот вариант я тоже рассматривал, но...
Цитата(v2v @  23.12.2008,  23:54 Найти цитируемый пост)
Спустя некоторое время повторно сканируешь и инициируешь нужное событие в случае изменения/удаления/добавления.

Надо не спустя некоторое время проверять, а именно тогда, когда добавился новый файл в директорию.

Цитата(v2v @  23.12.2008,  23:54 Найти цитируемый пост)
Задачка на пару часиков ...

Ну для меня может и побольше пары, но пока смотрю в сторону готового варианта smile

Добавлено через 3 минуты и 25 секунд
Вот нашел кое-что http://www2.hawaii.edu/~qzhang/FileSystemWatcher.html Завтра надо попробовать. Но все равно буду рад высказанным предложениям, мыслям и ссылкам smile
PM MAIL   Вверх
v2v
Дата 24.12.2008, 00:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1620
Регистрация: 20.9.2006
Где: Киев

Репутация: 8
Всего: 56



Цитата(garbuz @  24.12.2008,  00:05 Найти цитируемый пост)
а именно тогда, когда добавился новый файл в директорию.

воспользуйся JNI,  (но тогда твоё приложение не будет cross platform). 

Вот пример реализованного приложения под Windows http://technet.microsoft.com/uk-ua/sysinte...642(en-us).aspx
Вот либа для линукса ... http://oss.sgi.com/projects/fam/faq.html#why_use_fam

В общем если так подходить к вопросу то , и вправду будет не слишком просто.
А много директорий/файлов просматривать надо будет?


--------------------
PM   Вверх
garbuz
Дата 24.12.2008, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 677
Регистрация: 22.1.2008

Репутация: 3
Всего: 11



Посмотрел я то, о чем писал выше.  http://www2.hawaii.edu/~qzhang/FileSystemWatcher.html.
Проблема в следующем: в сорцах помимо классов java идут файлы cpp и h - это как я понимаю С++.
В java коде в одном месте в статик блоке вызывается следующее
Код

System.loadLibrary("FileSystemWatcher");

Ввлетает эксепшн
Код

Exception in thread "Thread-0" java.lang.UnsatisfiedLinkError: no FileSystemWatcher in java.library.path


Так, добавил в параметры запуска -Djava.library.path=C:\lib, туда естественно положив все cpp и h файлы, но все равно возникает та же самая проблема? Из-за чего? Я предполагаю, что из этих сипэпэшних файлов надо собрать dll. Верно? Или что-нибудь другое? Посоветуйте.



PM MAIL   Вверх
Temdegon
Дата 24.12.2008, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.10.2008
Где: Minsk

Репутация: 7
Всего: 9



Надо скомпилить библиотеку из cpp и h- файлов. Подробности тут http://antonsaburov.narod.ru/articles/jni.html

Это сообщение отредактировал(а) Temdegon - 24.12.2008, 16:14
PM MAIL   Вверх
garbuz
Дата 24.12.2008, 16:52 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 677
Регистрация: 22.1.2008

Репутация: 3
Всего: 11



А под визуалкой это можно сделать?
PM MAIL   Вверх
Temdegon
Дата 24.12.2008, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.10.2008
Где: Minsk

Репутация: 7
Всего: 9



Я устанавливал себе Visual Studio 6 и собирал из консоли таким образом:
Код

C:\temp\jni>cl -I "c:\Program Files\java\jdk1.6.0_10\include" -I "c:\Program
 Files\Java\jdk1.6.0_10\include\win32" -LD ApiAccess.cpp -FeApiAccess.dll

Разбираться как это сделать из среды разработки мне было откровенно лень.

Добавлено через 10 минут и 43 секунды
Держи. Я скомпилил твою либу. Попробуй подключить

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  FileSystemWatcherNative.rar 9,47 Kb
PM MAIL   Вверх
garbuz
Дата 24.12.2008, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 677
Регистрация: 22.1.2008

Репутация: 3
Всего: 11



Спасибо огромное!!! Сейчас попробую!

Добавлено через 11 минут и 7 секунд
Очень жаль, но что-то не вышло ... smile 
Код

24.12.2008 17:43:50 qzhang.io.FileSystemWatcher$Worker run
WARNING: Exception encountered.
java.lang.Exception: Exception Occurred
    at qzhang.io.FileSystemWatcherNative.FindFirstChangeNotification(Native Method)
    at qzhang.io.FileSystemWatcher$Worker.run(FileSystemWatcher.java:149)


Вот строка, где падает, самое начало метода  run
Код

long osWaitHandle = FileSystemWatcherNative.FindFirstChangeNotification(dirPath, includeSubdirectories, notifyFilter);


PM MAIL   Вверх
garbuz
Дата 24.12.2008, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 677
Регистрация: 22.1.2008

Репутация: 3
Всего: 11



Вот джавадок к этому методу
Код

/**
   * Creates a change notification handle and sets up initial change notification filter 
   * conditions. A wait on a notification handle succeeds when a change matching the filter 
   * conditions occurs in the specified directory or subtree. The function does not report 
   * changes to the specified directory itself.
   * 
   * @param lpPathName The path of the directory to watch.
   * @param bWatchSubtree True to indicate that subtree should be monitored as well.
   * @param dwNotifyFilter Filter conditions that satisfy a change notification wait. They are
   *        defined in <code>FileSystemMonitorConstants</code>.
   *        
   * @return A valid OS handle to a find change notification object.
   * 
   * @throws Exception If the function fails.
   */

PM MAIL   Вверх
Temdegon
Дата 24.12.2008, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.10.2008
Где: Minsk

Репутация: 7
Всего: 9



У меня тот же Exception. пока совсем непонятно с чем это связано. Надо попробовать как-то по другому собрать библиотеку. Там лежит файл проекта от 8-й Visual Studio, а у меня только шестая вижла. Дома есть инсталятор восьмой, так что ночью попробую скомпилить ей. Очень хочется разобраться, т.к. штука полезная.

Добавлено через 4 минуты и 53 секунды
ООО!!! у меня получилось!!!


Код

C:\temp\jni\src>javac Main.java

C:\temp\jni\src>java Main
[Wed Dec 24 17:06:03 EET 2008] Directory change detected.
[Wed Dec 24 17:06:03 EET 2008] Directory change detected.


Надо в main путь задать правильный и все дела!
На пример 
Код

  public static void main(String[] args) throws Exception {
    FileSystemWatcher w = new FileSystemWatcher(
        ".", NotifyFilters.FILE_NOTIFY_CHANGE_LAST_WRITE, true);  

для текущего каталога

Добавлено через 13 минут и 23 секунды
В общем, я не совсем понял как правильно задавать путь к нужному каталогу. работает для "." или на пример "\\photo". в общем, нужно детально в этом разобраться, а времени на это сейчас нет, много срочной работы. Но факт в том, что Exception выпадает именно из-за пути в конструкторе и что вся эта штука работает. РАзберешься как именно нужно - отпишись плиз
PM MAIL   Вверх
garbuz
Дата 24.12.2008, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 677
Регистрация: 22.1.2008

Репутация: 3
Всего: 11



Temdegon, большое спасибо за помощь!! Да, у меня тоже только пока с текущим каталогом работает ".", а вот чего с путями не работает - не знаю, буду ковырять...
У самого автора в примере написано 
Код

FileSystemWatcher w = new FileSystemWatcher("E:\\", NotifyFilters.FILE_NOTIFY_CHANGE_LAST_WRITE, true); 


Еще надо разобраться будет с фильтрами событий, а то фильтр, который по умолчанию FILE_NOTIFY_CHANGE_LAST_WRITE реагирует на сворачивание IDE а трэй 
Код

[Wed Dec 24 18:25:03 MSK 2008] Directory change detected.

Или действительно при этом событии что-то пишется... 
PM MAIL   Вверх
Temdegon
Дата 24.12.2008, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.10.2008
Где: Minsk

Репутация: 7
Всего: 9



задал путь ".\\photo"
задал фильтр NotifyFilters.FILE_NOTIFY_CHANGE_SIZE
создал в папке с main-файлом папку photo. Прога адекватно реагирует на создание новых файлов, изменение файлов в папке. Непонятно почему она реагирует на перезапись существующего в папке файла точно таким же файлом с таким же размером. Не реагирует на удаление файла. В общем, с фильтрами надо эксперементировать. Непонятно почему не получается задать полный путь "С:\\".
PM MAIL   Вверх
garbuz
Дата 24.12.2008, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 677
Регистрация: 22.1.2008

Репутация: 3
Всего: 11



Цитата(Temdegon @  24.12.2008,  18:55 Найти цитируемый пост)
Непонятно почему не получается задать полный путь "С:\\". 

Да, это самое необходимое smile

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0531 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.