Нужно ли блокировать файл, когда я хочу его удалить? - PullRequest
0 голосов
/ 30 октября 2018

У меня есть куча файлов в локальной файловой системе. Мой сервер будет обслуживать эти файлы. В некоторых случаях сервер получит инструкцию удалить файл. В настоящее время я использую 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);
}

EDIT:
Таким образом, оказывается, что приведенный выше код все равно не будет работать, потому что вы не можете изменить файл с помощью 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);
                    }

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

1 Ответ

0 голосов
/ 30 октября 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...