Есть php скрипт, который читает содержимое директории и обрабатывает файлы.
Как узнать, полностью ли файл залит в директорию или находится в стадии загрузки?
Пример: я копирую фильм в директорию (долго копируется), php скрипт получает содержимое директории, видит новый файл и пытается что-то с ним сделать, но сам файл еще копируется.
fopen отлично открывает такие файлы даже на запись, is_writable, is_readable и подобные, также говорят, что с файлом всё хорошо, rename отлично перемещает такой файл (получается битый).
Хм… а попробовать открыть такой файл с эксклюзивной блокировкой? Или… возможно есть у фтп какая настройка, что бы он сам лочил такой файл на время записи.
Скопируйте под одним именем (например, добавив в начало имени файла точку или нижнее подчеркивание), в скрипте напишите, что такие файлы надо пропускать. После окончания копирования переименуйте файл.
Тогда надо смотреть в зависимости от способа. Если закачивается через веб-интерфейс — то проблемы быть не должно (ибо файл сначала закачивается в /tmp, а потом уже передается скрипту). Если через FTP — то надо смотреть в сторону эксклюзивной блокировки (как подсказал Mear ниже), либо в сторону настроек сервера (вдруг он позволяет так же закачать файл во временную директорию с последующим его переносом?) Если что-то третье — то точно так же нужно рассматривать отдельно этот случай. Ну или воспользоваться универсальным костылем типа проверки времени файла (как подсказали shsweb и Mear).
Подозреваю, что FTP-сервер пишет в локальный файл порциями, буферизируя пришедшие данные и периодически скидывая их на диск. Если моё предположение верно, то в промежутках между сбросами, файл не заблокирован. Если так, то, в настройках ФТП-сервера может быть соответствующая галка, что бы блокировать файл на протяжении всего процесса закачивания.