Obtendo o tamanho de arquivo via File Handle em PHP

Artigo com uma dica rápida sobre como obter o tamanho de um arquivo a partir de seu resource do PHP (file handle).

Dica rápida

Caso você tenha um file handle aberto (tipo resource do PHP) e queira saber qual o tamanho do arquivo, pode usar as funções ftell e fseek para determinar o valor desejado. Basta encaminhar o ponteiro do arquivo para o final dele e depois obter a posição.

A utilização da função filesize não ajuda, pois para usá-la é necessário passar o caminho do arquivo. Existem situações em que não temos acesso a esse caminho. Para isso criei esta nova função.

/**
 * Obtem o tamanho de um arquivo pelo seu file handle (resource).
 * A posicao do ponteiro do handle e' preservada.
 * @param resource File handle
 * @return int
 */
function filesizehandle($file) {
    if (!is_resource($file)) {
        throw new InvalidArgumentException('Invalid variable type. Resource expected.', 1);
    }
    $pos_inicial = ftell($file);
    fseek($file, 0, SEEK_END);
    $tamanho = ftell($file);
    fseek($file, $pos_inicial, SEEK_SET);
    return $tamanho;
}

Uma utilização prática é quando você abre um arquivo temporário com a função tmpfile, realiza escrita e leitura no arquivo e, em determinado momento, precisa saber o tamanho do arquivo.

// Abrindo arquivo temporario
$tmp = tmpfile();

// Manipulando o arquivo (rw)
fwrite($tmp, 'teste');

// Obtendo o tamanho
$tamanho = filesizehandle($tmp);

Observação: para reduzir o tamanho do arquivo, existe a função ftruncate.

0 comentários