Я тестирую инструмент для изменения файлов, и одна из довольно важных возможностей при этом — указание размера файла, особенно когда файл еще открыт.
$file = tempnam('/tmp', 'test_');
file_put_contents($file, 'hello world');
echo 'Initial Read: ' . file_get_contents($file).PHP_EOL;
echo 'Initial Size: ' . filesize($file).PHP_EOL;
$fp = fopen($file, 'a');
fwrite($fp, ' then bye');
echo 'Final Read: ' . file_get_contents($file).PHP_EOL;
fclose($fp);
echo 'Final Size: ' . filesize($file).PHP_EOL;
Этот простой скрипт дает странные результаты:
Initial Read: hello world
Initial Size: 11
Final Read: hello world then bye
Final Size: 11
Я думал, что окончательный размер был бы результатом открытого файла, поэтому я добавил fclose($fp);
Однако это не имеет значения. В любом случае мне нужно иметь возможность определить размер, пока файл еще открыт.
Окончательный размер должен быть 20. Кто-нибудь знает возможную причину этого и как обойти это?
Как этот комментарий заявляет, вам нужно позвонить clearstatcache()
перед звонком filesize()
снова.
$file = tempnam('/tmp', 'test_');
file_put_contents($file, 'hello world');
echo 'Initial Read: ' . file_get_contents($file).PHP_EOL;
echo 'Initial Size: ' . filesize($file).PHP_EOL;
$fp = fopen($file, 'a');
fwrite($fp, ' then bye');
echo 'Final Read: ' . file_get_contents($file).PHP_EOL;
fclose($fp);
clearstatcache();
echo 'Final Size: ' . filesize($file).PHP_EOL;
Других решений пока нет …