Foros del Web » Programando para Internet » PHP »

tamaños de directorios (cuanto ocupa lo que hay dentro)

Estas en el tema de tamaños de directorios (cuanto ocupa lo que hay dentro) en el foro de PHP en Foros del Web. este es el más dificil todavía. a ver. mediante un formulario el usuario que se registra crea un directorio automáticamente con su nombre en el ...
  #1 (permalink)  
Antiguo 12/03/2007, 10:57
Avatar de estibaliz2006  
Fecha de Ingreso: noviembre-2006
Mensajes: 439
Antigüedad: 17 años, 5 meses
Puntos: 1
tamaños de directorios (cuanto ocupa lo que hay dentro)

este es el más dificil todavía. a ver. mediante un formulario el usuario que se registra crea un directorio automáticamente con su nombre en el servidor. luego, este usuario puede subir archivos a ese directorio. hasta aquí todo bien.

luego, el usuario tiene un panel al que accede y mediante el cual puede ver los datos que hay en ese directorio. entre otras cosas, puede ver el tamaño de los datos que hay en su directorio, de cada uno de los archivos.

luego, el administrador general de la web, puede acceder a su panel y ahí le saldrán los usuarios registrados. pero lo que yo quiero es que me dé el tamaño de cada directorio de cada uno de esos usuarios registrados. es decir, yo hago una consulta a la base de datos y extraigo los datos de los usuarios registrados (nombre, apellidos, y tal...) pero en otra columna quiero que aparezca el tamaño del directorio que lleva asociado ese usuario (tamaño global, es decir, sumando todos los archivos de ese usuario en ese directorio). cómo hago esto?
  #2 (permalink)  
Antiguo 12/03/2007, 11:58
 
Fecha de Ingreso: julio-2005
Ubicación: Buenos Aires, Argentina
Mensajes: 1.304
Antigüedad: 18 años, 9 meses
Puntos: 6
Re: tamaños de directorios (cuanto ocupa lo que hay dentro)

Averiguas los ficheros que hay en dicho directorio, averiguas el peso de cada uno y lo vas sumando. Si dentro de ese directorio existen subdirectorios, deberias usar una funcion recursiva.

o

podés leer los comentarios de la entrada de filesize del manual de php donde seguro encontrarás una funcion que haga todo esto.

Saludos..
__________________
Federico.

Mi página: www.jourmoly.com.ar
  #3 (permalink)  
Antiguo 12/03/2007, 13:44
Avatar de estibaliz2006  
Fecha de Ingreso: noviembre-2006
Mensajes: 439
Antigüedad: 17 años, 5 meses
Puntos: 1
Re: tamaños de directorios (cuanto ocupa lo que hay dentro)

unmmhh, no creo que sea tan fácil. a ver, lo que yo necesito es:

1º) saber que usuarios hay registrados pues esos usuarios son los que dan nombres a los diferentes directorios creados (recordad que cada vez que se registra un usuario, se crea un directorio en el servidor con su nombre). esto más o menos lo tengo, pues hago una consulta a la tabla de la base de datos que recoge los usuarios registrados. esto lo hago con esto:

Código PHP:
include("conexion.php"); 

$cnx mysql_query("SELECT nombre, apellidos, email FROM tabla order by apellidos ASC"); 
$num_reg=mysql_num_rows($cnx);
if(
$num_reg== 0)
{
print 
"Actualmente no hay clientes registrados";
}
else
while (
$row=mysql_fetch_array($cnx))
{
$nombre "".$row['nombre']."";
$apellidos "".$row['apellidos']."";    
$email "".$row['email']."";

echo (
"".$apellidos.", ".$nombre." -".$email."-");
}
mysql_free_result($cnx
esto lo que hace es que me da un listado por filas de los usuarios registrados. ahora, a la derecha de cada una de esas filas yo quiero mostrar una columna con el tamaño que cada uno de los directorios asociados a cada usuario tiene. es decir, supongamos que visualmente es esto:

/////////////////////////////////////////////////
usuario------------------tamaño directorio-----------
juancarlos---------------30 mb
roberto------------------45 mb
/////////////////////////////////////////////////
la primera parte, la del listado de usuarios ya la tengo con el código anterior, pero ¿cómo consigo sacar la otra columna, la del tamaño de cada directorio asociado a cada usuario?
  #4 (permalink)  
Antiguo 12/03/2007, 15:13
 
Fecha de Ingreso: julio-2005
Ubicación: Buenos Aires, Argentina
Mensajes: 1.304
Antigüedad: 18 años, 9 meses
Puntos: 6
Re: tamaños de directorios (cuanto ocupa lo que hay dentro)



Mientras vas pintando el listado de usuarios (que ya dices que lo tienes), por cada usuario chequeas su directorio asociado con las funciones para el sistema de archivos y luego...

Cita:
Iniciado por Fridureiks Ver Mensaje
Averiguas los ficheros que hay en dicho directorio, averiguas el peso de cada uno y lo vas sumando. Si dentro de ese directorio existen subdirectorios, deberias usar una funcion recursiva.

o

podés leer los comentarios de la entrada de filesize del manual de php donde seguro encontrarás una funcion que haga todo esto.
Pintas el peso total del directorio, y pasas al siguiente usuario.
__________________
Federico.

Mi página: www.jourmoly.com.ar
  #5 (permalink)  
Antiguo 13/03/2007, 04:00
Avatar de estibaliz2006  
Fecha de Ingreso: noviembre-2006
Mensajes: 439
Antigüedad: 17 años, 5 meses
Puntos: 1
Re: tamaños de directorios (cuanto ocupa lo que hay dentro)

nada, que no hay forma. me vuelvo loca y no consigo obtenerlo. he llegado a obtener el tamaño de un directorio, pero no de todos. no soy capaz. a ver, dice Fridureiks más abajo:

Cita:
Mientras vas pintando el listado de usuarios (que ya dices que lo tienes), por cada usuario chequeas su directorio asociado
no soy capaz de hacer esto. cómo lo hago. no lo consigo y llevo ya esta mañana tres horas con esta tontería.

luego dice:

Cita:
Averiguas los ficheros que hay en dicho directorio, averiguas el peso de cada uno y lo vas sumando. Si dentro de ese directorio existen subdirectorios, deberias usar una funcion recursiva.
pues no soy capaz de hacerlo. por favor, podéis ayudarme con la solución a mi gran problema? gracias
  #6 (permalink)  
Antiguo 13/03/2007, 06:56
 
Fecha de Ingreso: julio-2005
Ubicación: Buenos Aires, Argentina
Mensajes: 1.304
Antigüedad: 18 años, 9 meses
Puntos: 6
Re: tamaños de directorios (cuanto ocupa lo que hay dentro)

Cuando digo... "Mientras vas pintando el listado de usuarios (que ya dices que lo tienes), por cada usuario chequeas su directorio asociado" me refiero a esta porcion del codigo. Dentro de ese while es que debes ir chequeando los directorios, por ejemplo chekdir($row["directorio"]); donde checkdir es una funcion creada por ti para averiguar el peso de dicho directorio.

Código PHP:
while ($row=mysql_fetch_array($cnx))
{
$nombre "".$row['nombre']."";
$apellidos "".$row['apellidos']."";    
$email "".$row['email']."";

//
$peso chekdir($row["directorio"]);
//

echo ("".$apellidos.", ".$nombre." -".$email."-".$peso."-");


Si ya conseguiste obtener el tamaño de un directorio, solo debes colocar tu funcion mas arriba donde te indique.


Saludos.
__________________
Federico.

Mi página: www.jourmoly.com.ar

Última edición por Fridureiks; 13/03/2007 a las 07:11
  #7 (permalink)  
Antiguo 13/03/2007, 07:24
Avatar de estibaliz2006  
Fecha de Ingreso: noviembre-2006
Mensajes: 439
Antigüedad: 17 años, 5 meses
Puntos: 1
Re: tamaños de directorios (cuanto ocupa lo que hay dentro)

hola Fridureiks. ante todo, gracias por las molestias que te estás tomando conmigo y con este tema.

respecto a lo que nos ocupa. no hay forma. no soy capaz de conseguirlo. he estado mirando y requetemirando todo y no puedo. me estoy pegando cabezazos contra la pantalla. también he de decirte que no llevo mucho tiempo con php (sí con asp) y en algunas cosas aún me pierdo. pero por más que lo intento en este caso, no logro obtenerlo.

me dices que meta la llamada a una función checkdir para comprobar el tamaño de cada directorio. pero tengo dos problemas. primero, con la función. por más que he tratado de utilizar otras funciones para calcular el tamaño, siempre me da el error de que la variable de la función ya está definida y que estoy intentando redefinirla (no sé que y por qué sale esto).
segundo, esto me daría el tamaño de cada directorio, pero ¿cómo consigo ese tamaño, si por más que he probado con las funciones que aparecen en el manual de php.net, no hay nada que me lo haga (o yo no sé usarlas).

por favor, si me puedes echar un cablecito, te lo agradecería porque estoy desesperada.
  #8 (permalink)  
Antiguo 13/03/2007, 07:58
 
Fecha de Ingreso: julio-2005
Ubicación: Buenos Aires, Argentina
Mensajes: 1.304
Antigüedad: 18 años, 9 meses
Puntos: 6
Re: tamaños de directorios (cuanto ocupa lo que hay dentro)

Estimada estibaliz, encontre ésta función, la probe y funcionó bien... me refiero a que devolvio el peso del directorio... seguramente haya una mejor y que trabaje mas rapido(o no) pero te servira para salir del paso.

Código PHP:
<?php

/*
*
* Al final esta tu codigo
*
*/
function dirsize($directory)
{
    
// Init
    
$size 0;
 
    
// Trailing slash
    
if (substr($directory, -11) !== DIRECTORY_SEPARATOR) {
        
$directory .= DIRECTORY_SEPARATOR;
    }
 
    
// Create the stack array
    
$stack = array($directory);
 
    
// Iterate stack
    
for ($i 0$j count($stack); $i $j; ++$i) {
        
        
// Add to total size
        
if (is_file($stack[$i])) {
            
$size += filesize($stack[$i]);
 
        }
        
        
// Add to stack
        
elseif (is_dir($stack[$i])) {
            
// Read directory
            
$dir dir($stack[$i]);
            while (
false !== ($entry $dir->read())) {
                
// No pointers
                
if ($entry == '.' || $entry == '..') {
                    continue;
                }
 
                
// Add to stack
                
$add $stack[$i] . $entry;
                if (
is_dir($stack[$i] . $entry)) {
                    
$add .= DIRECTORY_SEPARATOR;
                }
                
$stack[] = $add;
 
            }
 
            
// Clean up
            
$dir->close();
        }
 
        
// Recount stack
        
$j count($stack);
    }
 
    return 
$size;
}

/*
*
* tu codigo
*
*/

include("conexion.php"); 

$cnx mysql_query("SELECT nombre, apellidos, email FROM tabla order by apellidos ASC"); 
$num_reg=mysql_num_rows($cnx);
if(
$num_reg== 0)
{
print 
"Actualmente no hay clientes registrados";
}
else
while (
$row=mysql_fetch_array($cnx))
{
$nombre "".$row['nombre']."";
$apellidos "".$row['apellidos']."";    
$email "".$row['email']."";

$peso dirsize($row['directorio']);

echo (
"".$apellidos.", ".$nombre." -".$email."-".$peso);
}
mysql_free_result($cnx)  
?>
Chequea ésta linea:

Código PHP:
$peso dirsize($row['directorio']); 
Cambia $row['directorio'] de ser necesario, no se como identificas los directorios.


Saludos,.
__________________
Federico.

Mi página: www.jourmoly.com.ar
  #9 (permalink)  
Antiguo 13/03/2007, 10:35
Avatar de estibaliz2006  
Fecha de Ingreso: noviembre-2006
Mensajes: 439
Antigüedad: 17 años, 5 meses
Puntos: 1
Re: tamaños de directorios (cuanto ocupa lo que hay dentro)

pues no sé, chico. algo debo estar haciendo mal porque nada. te cuento. implemento el código que me dices en mi aplicación:

Código PHP:
include("conex.php"); 
$cnx mysql_query("SELECT nombre, apellidos, email FROM tabla order by apellidos ASC"); 
$num_reg=mysql_num_rows($cnx);
if(
$num_reg== 0)
{
print 
"Actualmente no hay clientes registrados";
}
else

while (
$row=mysql_fetch_array($cnx))
{
$nombre "".$row['nombre']."";
$apellidos "".$row['apellidos']."";    
$email "".$row['email'].""

///como el nombre del directorio es el nombre del usuario, recojo ese dato en la variable path, al que le indico que los directorios creados están a su vez en el directorio modulos, con lo cual, la dirección de un directorio en concreto será modulos/nombrequesea
if(!isset($path))  
   {  
$path "modulos/$nombre";  
   }
//sustituyo donde pone directorio por la variable path en la función dirsize
function dirsize($path)
{
    
// Init
    
$size 0;
 
    
// Trailing slash
    
if (substr($path, -11) !== DIRECTORY_SEPARATOR) {
        
$path .= DIRECTORY_SEPARATOR;
    }
 
    
// Create the stack array
    
$stack = array($path);
 
    
// Iterate stack
    
for ($i 0$j count($stack); $i $j; ++$i) {
        
        
// Add to total size
        
if (is_file($stack[$i])) {
            
$size += filesize($stack[$i]);
 
        }
        
        
// Add to stack
        
elseif (is_dir($stack[$i])) {
            
// Read directory
            
$dir dir($stack[$i]);
            while (
false !== ($entry $dir->read())) {
                
// No pointers
                
if ($entry == '.' || $entry == '..') {
                    continue;
                }
 
                
// Add to stack
                
$add $stack[$i] . $entry;
                if (
is_dir($stack[$i] . $entry)) {
                    
$add .= DIRECTORY_SEPARATOR;
                }
                
$stack[] = $add;
 
            }
 
            
// Clean up
            
$dir->close();
        }
 
        
// Recount stack
        
$j count($stack);
    }
 
    return 
$size;
}
$peso dirsize($row["$path"]); 
bueno, y tiro palante con lo demás. luego hago
Código PHP:
<?php echo ("".$apellidos.", ".$nombre." -".$email."-".$peso);
}
mysql_free_result($cnx)
?>
bien. pues esto, que en principio debería funcionar, a mí me da estos errores:

Notice: Undefined index: modulos/juanantonio in paneladmin.php on line 483
(hace referencia a esta línea: $peso = dirsize($row["$path"]);)
Warning: dir(/lost+found/): failed to open dir: Permission denied in paneladmin.php on line 457
(hace referencia a esta línea: $dir = dir($stack[$i]);)
Fatal error: Call to a member function on a non-object in paneladmin.php on line 458
(hace referencia a esta línea: while (false !== ($entry = $dir->read())) {)

y así estamos. te agradezco muchísimo las molestias que te estas tomando conmigo, pero ya ves que esto no va ni a la de tres...

paneladmin.php es como llamo al archivo anterior donde está el código
  #10 (permalink)  
Antiguo 13/03/2007, 10:46
 
Fecha de Ingreso: julio-2005
Ubicación: Buenos Aires, Argentina
Mensajes: 1.304
Antigüedad: 18 años, 9 meses
Puntos: 6
Re: tamaños de directorios (cuanto ocupa lo que hay dentro)

No declares la funcion dentro del while, dejala como la coloque yo, fuera de todo, al principio.
Fijate que hice unos retoques.


Código PHP:
<?php

/*
*
* Al final esta tu codigo
*
*/
function dirsize($directory)
{
    
// Init
    
$size 0;
 
    
// Trailing slash
    
if (substr($directory, -11) !== DIRECTORY_SEPARATOR) {
        
$directory .= DIRECTORY_SEPARATOR;
    }
 
    
// Create the stack array
    
$stack = array($directory);
 
    
// Iterate stack
    
for ($i 0$j count($stack); $i $j; ++$i) {
        
        
// Add to total size
        
if (is_file($stack[$i])) {
            
$size += filesize($stack[$i]);
 
        }
        
        
// Add to stack
        
elseif (is_dir($stack[$i])) {
            
// Read directory
            
$dir dir($stack[$i]);
            while (
false !== ($entry $dir->read())) {
                
// No pointers
                
if ($entry == '.' || $entry == '..') {
                    continue;
                }
 
                
// Add to stack
                
$add $stack[$i] . $entry;
                if (
is_dir($stack[$i] . $entry)) {
                    
$add .= DIRECTORY_SEPARATOR;
                }
                
$stack[] = $add;
 
            }
 
            
// Clean up
            
$dir->close();
        }
 
        
// Recount stack
        
$j count($stack);
    }
 
    return 
$size;
}

/*
*
* tu codigo
*
*/

include("conexion.php"); 

$cnx mysql_query("SELECT nombre, apellidos, email FROM tabla order by apellidos ASC"); 
$num_reg=mysql_num_rows($cnx);
if(
$num_reg== 0)
{
print 
"Actualmente no hay clientes registrados";
}
else
while (
$row=mysql_fetch_array($cnx))
{
$nombre "".$row['nombre']."";
$apellidos "".$row['apellidos']."";    
$email "".$row['email']."";

$path "modulos/$nombre/";
$peso dirsize($path);

echo (
"".$apellidos.", ".$nombre." -".$email."-".$peso);
}
mysql_free_result($cnx)  
?>
__________________
Federico.

Mi página: www.jourmoly.com.ar
  #11 (permalink)  
Antiguo 13/03/2007, 11:30
Avatar de estibaliz2006  
Fecha de Ingreso: noviembre-2006
Mensajes: 439
Antigüedad: 17 años, 5 meses
Puntos: 1
Re: tamaños de directorios (cuanto ocupa lo que hay dentro)

ni aún poniendo la función al principio de la página la cosa va. siguen apareciendo los tres errores que te he comentado antes.
  #12 (permalink)  
Antiguo 13/03/2007, 11:51
 
Fecha de Ingreso: julio-2005
Ubicación: Buenos Aires, Argentina
Mensajes: 1.304
Antigüedad: 18 años, 9 meses
Puntos: 6
Re: tamaños de directorios (cuanto ocupa lo que hay dentro)

Pero corregiste tambien los otros cambios?

$path = "modulos/$nombre/";
$peso = dirsize($path);
__________________
Federico.

Mi página: www.jourmoly.com.ar
  #13 (permalink)  
Antiguo 13/03/2007, 12:35
Avatar de estibaliz2006  
Fecha de Ingreso: noviembre-2006
Mensajes: 439
Antigüedad: 17 años, 5 meses
Puntos: 1
Re: tamaños de directorios (cuanto ocupa lo que hay dentro)

sí, pero nada. al final he conseguido obtenerlo con otras dos funciones: la primera, me lee el directorio y me dice el tamaño, y con la segunda, transformo los bytes en MB, GB...

las funciones que hago son:

Código PHP:
function dirsize($path,$buf=2){ 
static 
$buffer
if(isset(
$buffer[$path])) 
return 
$buffer[$path]; 
if(
is_file($path)) 
return 
filesize($path); 
if(
$dh=opendir($path)){ 
$size=0
while((
$file=readdir($dh))!==false){ 
if(
$file=='.' || $file=='..'
continue; 
$size+=dirsize($path.'/'.$file,$buf-1); 

closedir($dh); 
if(
$buf>0
$buffer[$path]=$size
return 
$size

return 
false

la segunda funcion
Código PHP:
function humansize ($bytes){ 
$position 0
$units = array(" bytes"" Kb"" Mb"" Gb"" Tb" ); 
while( 
$bytes >= 1024 && ( $bytes 1024 ) >= ) { 
$bytes /= 1024
$position++; 


return 
round ($bytes1) . $units[$position]; 

y luego,

Código PHP:
while ($row=mysql_fetch_array($cnx))

{

$nombre "".$row['nombre']."";

$apellidos "".$row['apellidos']."";    

$email "".$row['email'].""
$path "modulos/$nombre";
$tamano humansize (dirsize ("$path")); 

echo (
"".$apellidos.", ".$nombre." -".$email."-".$tamano);

y por fin funciona....

gracias por todo, Fridureiks. un 10 en atención y preocupación por mi problema...
  #14 (permalink)  
Antiguo 13/03/2007, 12:52
 
Fecha de Ingreso: julio-2005
Ubicación: Buenos Aires, Argentina
Mensajes: 1.304
Antigüedad: 18 años, 9 meses
Puntos: 6
Re: tamaños de directorios (cuanto ocupa lo que hay dentro)

De nada :D

Esa primera función yo la habia visto antes pero no te la pase porque es para php5, y como por el momento lo mas corriente es php 4.x pense que no te serviria. La otra funcion a mi me anda barbaro, curioso... pero bueh, lo importante es que ya lo solucionaste.

Un saludo
__________________
Federico.

Mi página: www.jourmoly.com.ar
  #15 (permalink)  
Antiguo 13/03/2007, 13:10
Avatar de estibaliz2006  
Fecha de Ingreso: noviembre-2006
Mensajes: 439
Antigüedad: 17 años, 5 meses
Puntos: 1
Re: tamaños de directorios (cuanto ocupa lo que hay dentro)

pues ahora tengo otro problema, estimado Fridureiks. resulta que quiero contar el número de archivos de cada directorio. para ello, utilizo este código:

Código PHP:
while ($row=mysql_fetch_array($cnx))

{

$nombre "".$row['nombre']."";

$apellidos "".$row['apellidos']."";    

$email "".$row['email'].""
$path "modulos/$nombre";
$tamano humansize (dirsize ("$path")); 

//a partir de aquí, el código para contar los archivos
$dh  opendir($path);
while (
false !== ($file readdir($dh))) {
   
$archivos[] = $file;
}

$total_archivos count($archivos);
$total $total_archivos-2
bien. pues resulta que luego pongo
Código PHP:
echo ("".$apellidos.", ".$nombre." -".$email."-".$tamano."-".total."); 

y la historia va correcta, pero sólo para el primer directorio. me explico, supongamos que tengo tres directorios: el primero de ellos tiene 3 archivos, el segundo no tiene ninguno y el tercero tiene dos archivos.
el resultado que me da todo esto es este:
////////////////
nombre del directorio-----tamaño-------archivos
juanantonio--------------1MB----------3
anamaria-----------------0 b----------5
juanluis------------------0,5 MB-------9
//////////////////////////////
es decir, el primero está correcto: 3 archivos; el segundo coge los 3 archivos del primero y le suma el '.' y el '..' (a pesar que ya le pongo a la variable total el -2) con lo cual hacen un total de 5. y el tercero coge los 3 archivos del primero más los '.' y '..' del segundo más los dos archivos que tiene él más los '.' y '..' suyos. total, 9 archivos. qué demonios estoy haciendo mal?
  #16 (permalink)  
Antiguo 13/03/2007, 13:24
 
Fecha de Ingreso: julio-2005
Ubicación: Buenos Aires, Argentina
Mensajes: 1.304
Antigüedad: 18 años, 9 meses
Puntos: 6
Re: tamaños de directorios (cuanto ocupa lo que hay dentro)

Se debe a que no reinicias el vector que contiene los archivos, entonces el primer directorio funciona bien, pero el segundo cuenta los archivos del segundo mas los que habian en el primero... y lo mismo pasa con los siguientes directorios. Creo que asi se corrige.

Código PHP:
//a partir de aquí, el código para contar los archivos
$archivos = Array();
$dh  opendir($path);
while (
false !== ($file readdir($dh))) {
   
$archivos[] = $file;

__________________
Federico.

Mi página: www.jourmoly.com.ar
  #17 (permalink)  
Antiguo 13/03/2007, 13:31
Avatar de estibaliz2006  
Fecha de Ingreso: noviembre-2006
Mensajes: 439
Antigüedad: 17 años, 5 meses
Puntos: 1
Re: tamaños de directorios (cuanto ocupa lo que hay dentro)

si es que con las prisas una ya está bloqueada y se le pasan cosas de principiante.... eres un genio... mil veces gracias....
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:11.