Java I / O: убедитесь, что файл не заблокирован другим процессом перед выполнением любой операции чтения / записи - PullRequest
9 голосов
/ 10 января 2012

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

Но часто случается, что файл открывается другим процессом (т. Е. Word), что задерживает монопольную блокировку и не позволяет моему приложению выполнять какие-либо операции чтения / записи. Если какой-либо поток / канал создается для открытого файла, выдается исключение FileNotFoundException или FileSystemException для API nio с сообщением типа:

Процесс не может получить доступ к файлу, потому что он используется другим процессом

Мне не удалось найти решение, которое бы выявляло такие случаи, не маскируя «реальное» исключение FileNotFoundException, когда файл фактически не существует на fs.

Мне пришла в голову идея проверить существование через File.exists, а затем, если при открытии потока возникнет исключение FileNotFoundException, я смогу сделать вывод, что файл заблокирован. Я открыт для любых предложений по этому вопросу!

Спасибо!

Ответы [ 2 ]

1 голос
/ 10 января 2012

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

http://docs.oracle.com/javase/7/docs/api/java/nio/channels/FileChannel.html#tryLock%28%29

0 голосов
/ 10 января 2012

совместное использование документов в разных процессах довольно сложно, особенно если не использовать выделенные файловые системы (как, например, GFS). Я не думаю, что API блокировки Java может вам сильно помочь, я думаю, что вы на правильном пути с вашей идеей стратегии try / fail ... Используя Java 7, вы можете использовать WatchService для отслеживания изменений файлов, а затем действовать в соответствии с требованиями вашего бизнеса ... Какую систему вы используете? Windows хранит дескрипторы файлов в вечности ...

НТН Джером

...