Почему удаление ссылки успешно на открытом файле?
Почему открытый файл удален? В Windows Xamp я получаю сообщение "все еще работает", но на другом сервере PHP файл сервера удален, даже если он открыт, и я получаю сообщение "файл удален". Я тоже могу удалить файл с FTP, даже если первый скрипт все еще работает:(
<?php
$handle = fopen("resource.txt", "x");
sleep(10);
?>
<?php
if (file_exists("resource.txt") && @unlink("resource.txt") === false) {
echo "still worning";
exit;
}
else
echo "file deleted";
?>
1 ответ
Системы UNIX обычно позволяют вам это делать, да. Базовый C unlink
Функция задокументирована как таковая:
unlink()
Функция удаляет ссылку с именем path из своего каталога и уменьшает количество ссылок файла, на который ссылается ссылка. Если это уменьшение уменьшает количество ссылок файла до нуля, и ни у одного процесса нет открытого файла, то все ресурсы, связанные с файлом, освобождаются. Если один или несколько процессов открывают файл при удалении последней ссылки, ссылка удаляется, но удаление файла задерживается до тех пор, пока все ссылки на него не будут закрыты.
Другими словами, вы можете в основном пометить файл для удаления в любое время, но система фактически будет хранить его, пока приложения все еще обращаются к нему. Только когда все приложения выпустят файл, он будет фактически удален. Windows, по-видимому, не делает это таким образом.
В качестве примечания, поведение UNIX является единственным нормальным поведением в многопроцессорной среде. Если вам нужно подождать, пока все процессы закроют доступ к файлу, прежде чем система позволит вам удалить его, практически невозможно удалить часто используемые файлы. Да, вот где эти диалоговые окна Windows "Не удается удалить файл, который все еще используется, повторить попытку?" исходить от которого ты никогда не сможешь избавиться.