Должен ли я блокировать файл, когда я хочу его удалить?

У меня есть куча файлов в локальной файловой системе. Мой сервер будет обслуживать эти файлы. В некоторых случаях сервер получит инструкцию на удаление файла. В настоящий момент я использую FileChannel.lock() для получения блокировки файла, в основном это делается для того, чтобы убедиться, что какой-то другой процесс не редактирует файл, когда я пытаюсь удалить его.
Если я успешно установлю блокировку, могу Я немедленно удаляю файл или мне нужно сначала снять блокировку?
вот так:

FileOutputStream out = new FileOutputStream(file);
FileChannel channel = out.getChannel();
FileLock lock = channel.lock();
if(lock.isValid() && !lock.isShared()){
    Path filePath = Paths.get(file.getPath());
    Files.delete(filePath);
}

Нужно ли мне снимать блокировку после удаления файла?

Или должно быть так (добавлено lock.release()):

FileOutputStream out = new FileOutputStream(file);
FileChannel channel = out.getChannel();
FileLock lock = channel.lock();
if(lock.isValid() && !lock.isShared()){
    lock.release();
    Path filePath = Paths.get(file.getPath());
    Files.delete(filePath);
}

РЕДАКТИРОВАТЬ:
Получается, что приведенный выше код все равно не будет работать, потому что вы не можете изменить файл с помощью FileInputStream, потому что, конечно, он только для чтения. Я изменил приведенный выше код, чтобы вместо этого использовать FileOutputStream, но он по-прежнему не совсем работает, потому что, хотя я снимаю блокировку с канала, объект file по-прежнему имеет блокировку. Поэтому я изменил код так:

FileOutputStream out = new FileOutputStream(file);
                    FileChannel channel = out.getChannel();
                    FileLock lock = channel.lock();
                    if(lock.isValid() && !lock.isShared()){
                        channel.close();
                        boolean deleted = file.delete();
                        logger.info("{} @{} File {} deleted: {}", id, type, file.getName(), deleted);
                    }

Кажется, это работает, как и ожидалось. Я все еще хотел бы знать, безопасно ли это или есть лучший способ сделать это?


person mal    schedule 30.10.2018    source источник


Ответы (1)


Блокировка файла не работает при удалении файла. Блокировка файла будет работать только тогда, когда какой-либо другой процесс хочет отредактировать тот же файл. Перед удалением файла нужно снять блокировку и закрыть канал

person Nivedhitha N    schedule 30.10.2018
comment
Хорошо, круто, можешь бегло взглянуть на мою правку. Оказывается, channel.close() тоже снимает блокировку. - person mal; 30.10.2018