Блокировка и удаление файлов

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

        file = new RandomAccessFile("C:\\Temp\\report.txt", "rw");

        FileChannel fileChannel = file.getChannel();
        fileLock = fileChannel.tryLock();
        if (fileLock != null) {
            System.out.println("File is locked");

            try{

            //Do what i need    

            }catch (Exception e){//Catch exception if any
                System.err.println("Error: " + e.getMessage());
            }
        }
        else{
            System.out.println("Failed");
        }
    } catch (FileNotFoundException e) {
        System.out.println("Failed");
    }finally{
        if (fileLock != null){
            fileLock.release();
        }

Однако, если есть новая версия, я должен удалить старый файл и заменить его новым. Но блокировка файла не позволяет мне удалить файл.

Должен ли я разблокировать и удалить запись, полагая, что пользователь не будет писать в файл? Или есть другой способ сделать это?


person user1308768    schedule 24.06.2012    source источник
comment
Это все равно не сработает. FileLocks не запрещает пользователю изменять или удалять файл. Они только предотвращают блокировку файла другими программами.   -  person user207421    schedule 25.11.2013


Ответы (1)


Вы можете обрезать файл:

fileChannel.truncate(0);

а затем записать новую версию поверх нее, это не создаст временной промежуток, в течение которого пользователь сможет снова создать файл.

Из документации:

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

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

person Francisco Spaeth    schedule 24.06.2012
comment
Если я не пропускаю общую картину, это только стирает содержимое файла. Так что это не то, что мне было нужно. - person user1308768; 25.06.2012
comment
Должен ли я разблокировать и удалить запись, полагая, что пользователь не будет писать в файл? Или есть другой способ сделать это? Я ответил truncate, который вы можете использовать после того, как файл заблокирован, чтобы очистить содержимое и записать новое содержимое поверх него, поэтому вы не нет временного промежутка между удалением файла и созданием нового на основе файла, который нужно синхронизировать. - person Francisco Spaeth; 25.06.2012
comment
Я просто добавляю некоторые дополнительные пояснения... пожалуйста, дайте мне знать, если вам нужно больше разъяснений. - person Francisco Spaeth; 25.06.2012
comment
Ах хорошо. Это действительно решение. Я имел в виду операцию перемещения (docs.oracle.com/javase/7/docs/api/java/ nio/file/), поскольку это быстрее, чем копирование содержимого файла. Но до сих пор то, что вы это лучшее решение - person user1308768; 25.06.2012