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