2013-08-10 3 views
1

Я хочу использовать WatchService Java 7 для мониторинга изменений в каталоге.
Кажется, он пытается заблокировать папку и будет генерировать исключение, если он не работает, но, похоже, не предоставляет какой-либо метод блокировки его перед проверкой, если он уже заблокирован.Java - как узнать, используется ли какой-либо каталог другим процессом?

Мне нужно знать, используется ли какой-либо каталог другим процессом или нет. Так как я не могу заблокировать его или открыть для него поток (потому что это каталог), я ищу что-то более умное, чем пытаюсь изменить его и спать, если не удалось, или попробуйте/поймать сон.

В идеале, я бы хотел заблокировать вызов, пока он не будет доступен.

EDIT: Я не могу получить FileLock в папке. Когда я пытаюсь заблокировать папку, я получаю «FileNotFoundException (доступ запрещен)». Googling предлагает вам не использовать этот объект в каталоге.

Регистрационный код:

WatchService watchService = path.getFileSystem().newWatchService() 
path.register(watchService, 
        StandardWatchEventKinds.ENTRY_CREATE, 
        StandardWatchEventKinds.ENTRY_MODIFY, 
        StandardWatchEventKinds.ENTRY_DELETE) 

В противном случае сценарий:
Допустим, я слушаю папку f для создания нового.
Если в нем создана подкатегория g, я хочу послушать изменения в g. Однако, если я создаю новую папку в f (в Windows), это приведет к сбою, поскольку Windows блокирует папку до тех пор, пока не будет указано имя.

Благодаря

+0

Зачем вам нужно знать, используется ли он другим процессом, если все, что вы хотите, отслеживает его изменения? –

+0

, потому что регистр метода (http://docs.oracle.com/javase/7/docs/api/java/nio/file/Path.html#register(java.nio.file.WatchService,java.nio.file. WatchEvent.Kind ...)), который регистрирует изменения, генерирует исключение, если каталог используется. – Gal

+0

@Gal вы можете разместить код? –

ответ

2

Взятые из here

File file = new File(fileName); 
FileChannel channel = new RandomAccessFile(file, "rw").getChannel(); 
// Get an exclusive lock on the whole file 
FileLock lock = channel.lock(); 
try { 
    lock = channel.tryLock(); 
    // Ok. You get the lock 
} catch (OverlappingFileLockException e) { 
    // File is open by someone else 
} finally { 
    lock.release(); 
} 
+0

Я уже пробовал это, , но всякий раз, когда я пытаюсь заблокировать файл, я получаю «FileNotFoundException (доступ запрещен)». – Gal

2

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

http://jpathwatch.wordpress.com/

если вы читаете в функциях, вы можете видеть следующее:

Изменения в поддиректории * (рекурсивный мониторинг)

это то, что вам нужно. кажется, он делает это за вас, без необходимости вручную регистрировать каждый новый каталог. он ограничен выбранными платформами. и, проверяя это, кажется, что доступно только в окнах !!!! см. здесь: http://jpathwatch.wordpress.com/documentation/features/

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

Я думаю, что эта библиотека была бы самой элегантной и сохранит много кодирования для вас для этого дело.

+0

Спасибо, но я действительно смотрел на решение моей первоначальной проблемы, которая должна была выяснить, используется ли какой-либо каталог другим процессом. Я уже решил проблему ad-hoc с помощью try-catch-sleep. – Gal

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