2014-09-14 6 views
1

Я тестирую инструмент для изменения файлов, и одна довольно важная способность во время этого указывает размер файла, особенно если файл все еще открыт.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); 
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. Кто-нибудь знает возможную причину этого и как его обойти?

ответ

5

Как заявляет this comment, необходимо позвонить 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; 
+0

Thats excellent, спасибо. – Flosculus

Смежные вопросы