2012-01-10 1 views
8

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

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

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

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

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

Спасибо!

+0

когда-нибудь найти решение этой проблемы? –

+0

В итоге я использовал эвристику, если File.exists возвращает true в блоке catch FileNotFoundException. Я интерпретирую его как заблокированный файл. – sylvain

ответ

1

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

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

+0

Мне не удалось вызвать tryLock(), поскольку указанные исключения выбрасываются, когда я пытаюсь получить FileChannel через RandomAccessFile или FileOutputStream. – sylvain

+0

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

+1

Я предполагаю, что собственные приложения могут иметь более ограничительные блокировки, чем те, которые доступны в JVM. – sylvain

0

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

НТН Jerome

+0

Действительно, у меня уже есть поток WatchService, который прослушивает события FS, пока работает только на Windows. В любом случае я знал, что не будет доступа к этим заблокированным файлам, но я удивлен, что API java.io или java.nio не проверяет их доступность. – sylvain

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

  • Нет связанных вопросов^_^