Anonym
@Anonym
Программирую немного )

PHP: Проверить, открыт ли файл на запись

Есть php скрипт, который читает содержимое директории и обрабатывает файлы.
Как узнать, полностью ли файл залит в директорию или находится в стадии загрузки?

Пример: я копирую фильм в директорию (долго копируется), php скрипт получает содержимое директории, видит новый файл и пытается что-то с ним сделать, но сам файл еще копируется.

fopen отлично открывает такие файлы даже на запись, is_writable, is_readable и подобные, также говорят, что с файлом всё хорошо, rename отлично перемещает такой файл (получается битый).
  • Вопрос задан
  • 4210 просмотров
Пригласить эксперта
Ответы на вопрос 6
shsweb
@shsweb
Можно проверять размеры файлов. Если за минуту(несколько минут, час и т.д.) размер файла не изменился, предположить что он залит полностью.
Ответ написан
Комментировать
Хм… а попробовать открыть такой файл с эксклюзивной блокировкой? Или… возможно есть у фтп какая настройка, что бы он сам лочил такой файл на время записи.
Ответ написан
lacki
@lacki
вариантов кроме как делать lsof директории от root не вижу. запуск только lsof от root без ввода пароля можно реализовать через sudoers.
Ответ написан
Комментировать
AloneCoder
@AloneCoder
[object Object]
Используйте контрольные суммы или копируйте с временным расширением
Ответ написан
ertaquo
@ertaquo
Скопируйте под одним именем (например, добавив в начало имени файла точку или нижнее подчеркивание), в скрипте напишите, что такие файлы надо пропускать. После окончания копирования переименуйте файл.
Ответ написан
@resurection
Подозреваю, что FTP-сервер пишет в локальный файл порциями, буферизируя пришедшие данные и периодически скидывая их на диск. Если моё предположение верно, то в промежутках между сбросами, файл не заблокирован. Если так, то, в настройках ФТП-сервера может быть соответствующая галка, что бы блокировать файл на протяжении всего процесса закачивания.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы