Как создать монитор для определенного каталога? - PullRequest
1 голос
/ 09 октября 2009

Используя Java поверх Windows Vista, я пытаюсь создать своего рода монитор для каталога, поэтому каждый раз, когда этот каталог изменяется (новые, переименованные, обновленные или удаленные файлы), запускается процесс. Я попытался сделать это с помощью цикла, который будет выполнять dir в каталоге и анализировать все файлы. Но это занимает очень много времени и памяти, особенно когда количество файлов начинает расти. Я думаю, что должен быть лучший способ сделать это.

note : для этого существует аналогичный вопрос , но для C #.

Ответы [ 4 ]

4 голосов
/ 09 октября 2009

Я думаю, что должен быть лучший способ сделать это.

Вы правы, должен быть лучший способ и он идет с Java 7. См. Предстоящий WatchService API .

Не имея сборки RC, я не знаю, есть ли переносимый способ сделать то, что вы описываете.

3 голосов
/ 09 октября 2009

Если вы не можете дождаться Java 7 и WatchService , вам придется сделать что-то вроде этого:

final File watched = new File("[path of directory to watch]");
long lastModified = watched.lastModified();
while(true) {
    if (watched.lastModified() > lastModified) {
        // Change happened in the directory do what you want.
    }
    Thread.sleep(2000); // 2 second interval
}
1 голос
/ 09 октября 2009

Вам, вероятно, понадобится использовать JNI для вызова ReadDirectoryChangesW. Вместо этого вы можете использовать FirstFirstChangeNotification и FindNextChangeNotification, но если вам не нужна совместимость со старыми (16-разрядными) версиями Windows, я бы посоветовал против этого.

1 голос
/ 09 октября 2009

Что именно вы отслеживаете? Я ожидаю, что вам просто нужно следить за временем изменения каталога, а затем проверять время изменения файлов, если каталог был изменен.

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

К сожалению, нет простого способа использования Java для проверки каталога на наличие изменений, кроме опроса каталога в некотором объеме. См. мой предыдущий ответ относительно. этот вопрос и библиотеки, которые вы можете использовать для упрощения этого (плюс функция Java 7)

...