$file->eof() sempre retornando false ao usar o SplFileObject do PHP
-
13-12-2019 - |
Pergunta
Por que meu script PHP está travado?
$path = tempnam(sys_get_temp_dir(), '').'.txt';
$fileInfo = new \SplFileInfo($path);
$fileObject = $fileInfo->openFile('a');
$fileObject->fwrite("test line\n");
var_dump(file_exists($path)); // bool(true)
var_dump(file_get_contents($path)); // string(10) "test line
// "
var_dump(iterator_count($fileObject)); // Hangs on this
Se eu excluir a última linha (iterator_count(...
) e substitua-o por isto:
$i = 0;
$fileObject->rewind();
while (!$fileObject->eof()) {
var_dump($fileObject->eof());
var_dump($i++);
$fileObject->next();
}
// Output:
// bool(false)
// int(0)
// bool(false)
// int(1)
// bool(false)
// int(2)
// bool(false)
// int(3)
// bool(false)
// int(4)
// ...
O $fileObject->eof()
sempre retorna falso, então recebo um loop infinito.
Por que essas coisas estão acontecendo?Preciso obter uma contagem de linhas.
Solução
Pelo que vejo no seu código, você está abrindo o arquivo com mode a
nesta linha:
$fileObject = $fileInfo->openFile('a');
Quando você faz isso, é apenas escrito:
$fileObject->eof()
precisa ler o arquivo, você deve abrir o arquivo com a+
para permitir leitura/gravação:
$fileObject = $fileInfo->openFile('a+');
Ps:quer com a
ou a+
, o ponteiro vai para o final do arquivo.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow