File lock in Java

Модератор: Absurd

Ответить
Аватара пользователя
Oscar
Сообщения: 963
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

Добрый день!

Возник вопрос: как временно защитить файл от записи/удаления средствами Java?


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

Вскормлённый молоком Майкрософта и взращённый на полях ЭмЭс Офиса, он придумал следующие требования:
  1. Файлы, открытые одной инстанцией нашей программы, не должны быть изменяемыми другими инстанциями оной же.
  2. Файлы, открытые нашей программой должны быть защищены от изменений и удаления (на уровне ОС).
С первым пунктом никаких проблем возникнуть не должно, поскольку всё в наших руках. Делаем "file lock" при чтении, работаем с файлом, записываем, изменяем, а при закрытии снимаем lock. А перед чтением (или записью, в зависимости от логики) проверяем наличие этого самого замка и делаем выводы.

Методы создания замка:
1. java.nio.FileChannel.lock()
2. вручную (создаём файл filename.lock)

Но второй пункт требований загоняет меня немного в тупик.

К сожалению Windows под рукой нету, проверял на linux и ему FileChannel.lock() как-то "по барабану" (файлы можно так же менять и удалять, как и без замка).

Решение "вручную" - уж точно не пройдёт.

Но у класса java.io.File есть интересный метод file.setReadOnly()

Наиболее занятная особенность этого метода, что у него не существует инверсного метода. Если файл поставить один раз "read only", то разрешить в него запись в дальнейшем просто невозможно. (SUN вроди как обещал добавить новые методы в Mustang, но в нашем проэкте используется пока что java 1.5 по причине совместимости с софтом индустриальных заказчиков).

Временное решение, предложенное SUN-ом в ответ на этот "баг" - удалить файл и перезаписать заново.
Как удалить файл защищённый от записи? :)

При установке file.setReadOnly() права на файл изменяются с "rw-r--r--" на "r--r--r--" (логично), НО! до тех пор, пока программа, изменившая права, не закрыта, она спокойно может сделать file.delete() и защита от записи её ни капли не остановит!
Если же программа была закрыта (или "упала" в следствии crash), разрешить запись в файл становится просто невозможно (file.delete() вылетает по permission denied exception).

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


Более конкретный вопрос : занимался ли кто-нибудь решением подобной задачи, существует ли стандартное её решение и возможно ли это в принципи?
mobius
Сообщения: 157
Зарегистрирован: 25 янв 2005, 18:42
Откуда: Минск
Контактная информация:

По поводу винды, у неё есть такая особенность, если файл открыт другим приложением (не помню на запись или на чтение), то другое приложение с ним ничего сделать не сможет

А задание прав доступа к примеру на fat32 работать ну никак не будет
Всё об отдыхе на http://chugaga.com
Аватара пользователя
Oscar
Сообщения: 963
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

mobius, спасибо за ответ, но я отчётливо помню, как удалял с десктопа текстовый файл, открытый в блокноте.

Уверен, что при помощи Win API есть механизмы защиты, но "к сожалению" Java является кроссплатформенной :) и использование этого API (по крайней мере на прямую) не является возможным.
mobius
Сообщения: 157
Зарегистрирован: 25 янв 2005, 18:42
Откуда: Минск
Контактная информация:

Как вариант использование native функций :)
Всё об отдыхе на http://chugaga.com
Ответить