Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Tenho alguns clientes que utilizam um sistema de upload e download de arquivos e documentos como se fosse um disco virtual para uma imobiliária para eles poderem acessar depois e repassar para a equipe.
O meu problema é que preciso monitorar o tamanho do espaço ocupado para poder ir cobrando pelo espaço conforme cada cliente utiliza seu espaço.
Pensei em fazer uma forma de usar o opendir e readdir porém não sei como somar os tamanhos dos arquivos.
Segue o código:
if ($handle=opendir("./")) //abre diretório para leitura
{
$x=0;
while (false!==($file=readdir($handle))) //lê arquivos do diretório
{
if ($file!="." && $file!=".." && $file!="index.php") //evita leitura de . e ..
{
$matrix[$x]=$file; //armazena nomes dos arquivos na matriz
$x++;
} //if
} //while
closedir($handle); //fecha o diretório
} //if
$x=0;
while($matrix[$x]) //imprime links com nomes dos arquivos
{
if($x%2==0)
{
echo '<tr bgcolor="#FFFFCC">';
} //if
else
{
echo '<tr bgcolor="#FFFF99">';
} //else
echo '
<td><strong><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><a href="../'.$matrix[$x].'" target="_blank">'.$matrix[$x].'</a></font></strong></td>
<td align="center"><strong><font size="2" face="Verdana, Arial, Helvetica, sans-serif">'.date("d/m/Y - H:i", filemtime($matrix[$x])).'</font></strong></td>
</tr>
';
$x++;
} //while>
3 horas atrás, Matheus Tavares disse:
Amigo, veja se isso te ajuda:
<?php
function folderSize ($dir)
{
$size = 0;
foreach (glob(rtrim($dir, '/').'/*', GLOB_NOSORT) as $each) {
$size += is_file($each) ? filesize($each) : folderSize($each);
}
return $size;
}
//exemplo de uso: echo 'Tamanho da pasta: ' . folderSize( 'caminho/para/pasta/' );
Fonte: [https://gist.github.com/eusonlito/5099936](https://gist.github.com/eusonlito/5099936)
Ajudou sim mas a medida está em bytes?Sim, em bytes, pois é a unidade utilizada pela função filesize. Veja: http://php.net/manual/pt_BR/function.filesize.php
Você pode utilizar essa função para representar de forma mais amigável:
<?php
/**
* @author Matheus Tavares
*/
function convert_bytes( $size_in_bytes, $precision = 2, $i = 0 ) {
$notation = [ '', 'K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y' ];
return ( $size_in_bytes < 1024 )
? sprintf(
'%.'.$precision.'f %s',
$size_in_bytes, $notation[$i] . 'B'
)
: convert_bytes( $size_in_bytes / 1024 , $precision , ++$i );
}
//Exemplo:
$tamanho_em_bytes = 1069;//aqui vem a função que calcula o tamanho da pasta
echo convert_bytes( $tamanho_em_bytes );//Resultado: 1.04 KB
echo '<br>';
$tamanho_em_bytes = 302942231;//aqui vem a função que calcula o tamanho da pasta
echo convert_bytes( $tamanho_em_bytes );//Resultado: 288.91 MB
Apenas uma observação: o tamanho representado é o KiB / MiB / GiB, etc, que é a notação computacional.
Os valores "mais corretos" seriam a pura divisão por 1000 (10 na potência de 3), e não por 1024 (2 na potência de 10) como feito na função. Fica a seu critério alterar isso ou não.
O Google, por exemplo, indica que 1069 bytes são 1.069 KB, e não os 1.04 KiB indicados no script acima.
Veja: https://en.m.wikipedia.org/wiki/Orders_of_magnitude_(data))
Mas isso tudo é um detalhe pouco impactante/importante no seu caso.
Amigo, veja se isso te ajuda:
{