No corrijan las pequenieces que puede haber, pero el GRAN problema, es que al usar este código en un directorio con pocos archivos o directorios, corre joya, pero si lo uso en algun directorio muy grande, me termina diciendo que no hay memoria, ya que la función al ser recursiva, va consumiendo y consumiendo más memoria. Para hacer esto, uso el Turbo C 3.1, Estaba trabajando con el modelo SMALL de memoria, asique pense en hacer los punteros lejanos para poder acceder al MB, y seleccione el modelo HUGE y declare AUX_FICHEROS como char huge *AUX_FICHEROS, pero sigue sin funcionar =(.
La variable CONT es ver cuantas veces se pidio memoria a malloc, solo para control personal.
Si alguien pudiese decirme como mejorar esto se lo agradecería.
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <dir.h>
#include <dirent.h>
#include <string.h>
#include <sys\stat.h>
#include <sys\types.h>
unsigned long Calcula_Tamanio(char *, unsigned long);
void Falta_Mem();
int CONT=0;
void main()
{
char *DR="d:\\tc";
FILE *F;
int TAM=0;
clrscr();
printf("%ld",Calcula_Tamanio(DR,0));
getch();
}
unsigned long Calcula_Tamanio(char *FICHERO, unsigned long TAMANIO)
{
FILE *FP_FICHERO;
char *AUX_FICHERO;
DIR *PS_DIR;
struct dirent *DIRECTORIOS;
struct stat INFO_FICHERO, INFO_AUX_FICHERO;
stat(FICHERO,&INFO_FICHERO);
if(!(PS_DIR=opendir(FICHERO)))
{
printf("No se ha podido calcular el tama¤o de %s",FICHERO);
return -1;
}
DIRECTORIOS=readdir(PS_DIR);
while(DIRECTORIOS!=NULL)
{
//Genero AUX_ORIGEN de acuerdo al largo del directorio
if(!(AUX_FICHERO=(char*)malloc(sizeof(char)*(strle n(FICHERO)+strlen(DIRECTORIOS->d_name)+2))))
Falta_Mem();
//El nuevo directorio o archivo se carga en AUX_ORIGEN para chequear que es?
strcpy(AUX_FICHERO,FICHERO);
strcat(AUX_FICHERO, "\\");
strcat(AUX_FICHERO,DIRECTORIOS->d_name);
//Cargo una estructura del nuevo archivo o directorio
stat(AUX_FICHERO,&INFO_AUX_FICHERO);
//Verifico si es un directorio. Si es un directorio,,,entro
if(INFO_AUX_FICHERO.st_mode==ES_DIR)
if(strcmpi(DIRECTORIOS->d_name, ".")!=0 && strcmpi(DIRECTORIOS->d_name, "..")!=0)
//Si hay otro directorio dentro entro /*RECURSIVIDAD*/
TAMANIO=Calcula_Tamanio(AUX_FICHERO, TAMANIO);
else;
else
TAMANIO=TAMANIO+INFO_AUX_FICHERO.st_size;
DIRECTORIOS=readdir(PS_DIR);
}
closedir(PS_DIR);
free(AUX_FICHERO);
free(DIRECTORIOS);
return TAMANIO;
}
void Falta_Mem()
{
printf("\nMemoria insuficiente, no se podr continuar. %d",CONT);
getch();
exit(1);
}