Закончилось ли формирование файла ?

SeaGull

Junior Member
Возможно ли в один проход (без отслеживания динамики изменения размера файла) определить, закончилось ли формирование указанного файла программой? Известно, что формирование интересующего файла происходит сразу целиком, без повторных открытий-дописываний.

Всё что придумал, это сравнивать filectime() с fileatime() или filemtime(), но это не будет работать для мелких файлов, формирующихся менее чем за секунду.
 

SeaGull

Junior Member
Я правильно понимаю идею с flock(): попытаться заблокировать файл. Если не получилось - значит он еще формируется ?

Но у меня flock($fp, LOCK_EX) одинаково стабильно выдает "true" что на этапе создания файла, что после него :-(
 

fixxxer

К.О.
Партнер клуба
flock будет ждать освобождения лока, если файл залочен.

PHP:
<?php

function log_msg($s) {
    echo microtime(true) . ' ' . $_SERVER['argv'][1] . ' ' . $s . "\n";
}

log_msg('Start');
$f = fopen('test', 'a+');
log_msg('Acquire lock');
flock($f, LOCK_EX);
log_msg('Process');
ftruncate($f, 0);
fseek($f, 0);
fwrite($f, $_SERVER['argv'][1]);
sleep(10);
log_msg('Unlock');
flock($f, LOCK_UN);
fclose($f);
log_msg('Done');
Код:
$ (php test.php 1 &);(sleep 1 && php test.php 2 &)

1413569857.6385 1 Start
1413569857.6386 1 Acquire lock
1413569857.6386 1 Process
1413569858.6245 2 Start
1413569858.6246 2 Acquire lock
1413569867.6401 1 Unlock
1413569867.6403 1 Done
1413569867.6406 2 Process
1413569877.6427 2 Unlock
1413569877.6434 2 Done
 
  • Like
Реакции: WMix

AnrDaemon

Продвинутый новичок
Открыть файл на запись. Если откроется - вероятно(!), формирование завершено.
 

antson

Новичок
Партнер клуба
SeaGull, а программу, которая формирует файл можно изменить ?
чтобы пока файл формируется файл имел другое имя или доп расширение.
по типу filename.ext.inprocess

как она вызывается ? или сидит демоном ? или может есть апи, чтобы проверить статус.

н-р если это консольная утилита и имя выходного файла задается параметром,
то можно написать bat cmd под виндой.
где второй строкой после завершения переименование к нужному имени
можно также обернуть до вызова установкой семафора, а после его удалением.
 

SeaGull

Junior Member
Нет, программа чужая, изменить её нельзя.

А вот за наводку с переименованием файла огромное спасибо.
Пожалуй, так проблему и буду решать:
Код:
if (!@rename($filename, $new_filename)) { файл еще занят }
 

AnrDaemon

Продвинутый новичок
Если это работает, должна и лочка файла работать, по идее.
 
Сверху