#php
Приветствую. Мне нужно сделать следующее:
Прочитать содержимое файла.
Удалить файл.
При этом файл не должен быть доступен для записи до тех пор, пока мы не закончим
чтение и не удалим файл.
Вот фрагмент кода:
$h = fopen(__DIR__.'/file.txt', 'r+');
flock($h, LOCK_EX);
$str = file_get_contents(__DIR__.'/file.txt');
unlink(__DIR__.'/test.txt');
flock($h, LOCK_UN);
fclose($h);
Правильно ли так писать? Просто закрывать и разблокировать файл, которого уже нет
выглядит не очень корректно... А если удалять уже после разблокировки и вызова fclose(),
то в промежутке между fclose() и unlink() другой скрипт ведь может что-то записать в файл.
Ответы
Ответ 1
Просто закрывать и разблокировать файл, которого уже нет А он ещё есть в действительности. И будет доступен его открывшим приложениям всё время, пока на него есть открытые ссылки. И только когда закроется последний открытый дескриптор файл пропадёт (и то пропадёт только когда ФС скомандует trim либо переиспользует блоки под что-нибудь другое). melkij@melkij:~$ echo 42 > tmp/rmfile melkij@melkij:~$ php -a Interactive mode enabled php > $fp = fopen('tmp/rmfile', 'r+'); php > unlink('tmp/rmfile'); php > echo fread($fp, 100); 42 php > var_dump(file_exists('tmp/rmfile')); bool(false) Эта особенность, кстати, иногда может помочь восстановить случайно удалённый файл чтением открытого дескриптора из /proc/$PID/fdОтвет 2
Есть еще из книги PHP5 2-е издание (Котерова):
Комментариев нет:
Отправить комментарий