Ir al contenido


Foto

Contar Archivos y carpetas Recursivamente


  • Por favor identifícate para responder
26 respuestas en este tema

#21 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.111 mensajes
  • LocationMadrid - España

Escrito 06 marzo 2012 - 03:38

Lo acabo de probar pero al realizar la llamada se cuelga todo el system..... he revisado en el taskmanager y cuado lo ejecuto como que empieza a consumir toda la ram....a que se deberà......???  :undecided:


En principio cuando lo probé no fallaba. Ten en cuenta que si estás analizando una carpeta con un contenido muy grande de subcarpetas, ocurren dos cosas: la primera es que el código tardará mucho y parecerá colgado. La segunda que el consumo de la pila se dispara y si se consume...

Para evitar que parezca colgado puedes añadir una línea con un Application.ProcessMessages, por ejemplo en esta parte:


delphi
  1. ......
  2.   repeat
  3.     Application.ProcessMessages;
  4.     if ((SR.Attr and fadirectory) = fadirectory) then
  5.     begin
  6.       .......


Otra opción interesante es usar un hilo a parte.

Si el problema está en la pila, debes cambiar por completo esa función. Usa los otros ejemplos que te dí.


Saludos.
  • 0

#22 monchito_elroro

monchito_elroro

    Advanced Member

  • Miembros
  • PipPipPip
  • 260 mensajes

Escrito 07 marzo 2012 - 06:31

Ok amiguito, Seguirè probando y les cuento.... :)
  • 0

#23 monchito_elroro

monchito_elroro

    Advanced Member

  • Miembros
  • PipPipPip
  • 260 mensajes

Escrito 26 marzo 2012 - 09:40

Buenas con todos amiguitos, al fin tuve tiempo para probar el código:



delphi
  1. procedure TotalFilesFolders(Path:string);
  2. var
  3. SR: TSearchRec;
  4. begin
  5. ChDir(Path);
  6. if FindFirst ('*.*', faanyfile, SR )=0 then    // le he puesto anyfile
  7. repeat
  8. if ((SR.Attr and fadirectory) = fadirectory) then
  9. begin
  10. if (SR.Name <> '.') and (SR.Name <> '..') then
  11. begin
  12. myfiles:=myfiles+1;
  13. //Inc(TotalFolders);
  14. TotalFilesFolders(Path + '\' + SR.Name ); 
  15. end
  16. end
  17. else
  18. myfiles:=myfiles+1;
  19. //Inc(TotalFiles);
  20. until FindNext(SR) <> 0;
  21. FindClose( SR );
  22. end;



con su respectiva llamada:


delphi
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. begin
  3. myfiles:=0;
  4. TotalFilesFolders('E:\');
  5. ShowMessage(IntToStr(myfiles));
  6. end;



y me he dado cuenta que en WinXP funciona bien.... pero cuando lo ejecuto en Win7 se chupa toda la memoria, solo cuando lo ejecuto con clic derecho "Ejecutar como administrador" trabaja bien....

Al final creo que optaré por la función del amigo Escafranda....
seguiré probando y en su momento les comentaré.... Gracias.  :)
  • 0

#24 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 29 marzo 2012 - 06:47

Una pregunta,
¿Es posible implementar una exploración de directorios y subdirectorios sin recurrir a la recursividad?
Porque si el problema es la pila a causa de tantas llamadas recursivas y se necesita de explorar carpetas y subcarpetas entonces no veo modo de hacerlo sin recursividad.

Hay problemas que no pueden resolverse sin recursión, y hay un teorema que lo demuestra, pero desconozco si este es uno de ellos.

Saludos,
  • 0

#25 monchito_elroro

monchito_elroro

    Advanced Member

  • Miembros
  • PipPipPip
  • 260 mensajes

Escrito 01 junio 2015 - 10:53

Buenas con todos, a los tiempos amigos del foro, quería hacerles una consulta especialmente al amigo "Escafandra".

Hace un tiempo compartio un código para contar todos los archivos y carpetas de una unidad o directorio, el código era este:
 


php
  1. function FileFolderCount(Dir:String): integer;
  2. var
  3.   sr: TSearchRec;
  4. begin
  5.     Result:= 0;
  6.     if FindFirst(Dir + '\*.*', faAnyFile, sr) = 0 then
  7.     repeat
  8.       if (sr.Name <> '.') and (sr.Name <> '..') then
  9.       begin
  10.           if (sr.Attr and faDirectory)<>0 then
  11.           begin
  12.             inc(Result);
  13.             // Para añadir subcarpetas
  14.             Result:= Result + FileFolderCount(Dir + '\' + sr.Name);
  15.           end else
  16.             inc(Result);
  17.       end;
  18.     until FindNext(sr)<>0;
  19.     FindClose(sr);
  20. end;

Y su Ejemplo de uso es:


php
  1. Label.Caption:= IntToStr(FileFolderCount('C:\adaptec'));

Funciona perfectamente, mas mi consulta es como le puedo agregar un parametro para elegir cuando el conteo sea recursivo o conteo sin recursión, agradezco de antemano sus ayudas. :)


  • 0

#26 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.111 mensajes
  • LocationMadrid - España

Escrito 03 junio 2015 - 04:41

Solo tienes que añadir un parámetro a la función para elegir si quieres contar en subcarpetas o no:

delphi
  1. function FileFolderCount(Dir:String; SubFolder: boolean = true): integer;
  2. var
  3. sr: TSearchRec;
  4. begin
  5. Result:= 0;
  6. if FindFirst(Dir + '\*.*', faAnyFile, sr) = 0 then
  7. repeat
  8. if (sr.Name <> '.') and (sr.Name <> '..') then
  9. begin
  10. if (sr.Attr and faDirectory)<>0 then
  11. begin
  12. inc(Result);
  13. // Para añadir subcarpetas
  14. if SubFolder then Result:= Result + FileFolderCount(Dir + '\' + sr.Name);
  15. end else
  16. inc(Result);
  17. end;
  18. until FindNext(sr)<>0;
  19. FindClose(sr);
  20. end;



Saludos.
  • 1

#27 monchito_elroro

monchito_elroro

    Advanced Member

  • Miembros
  • PipPipPip
  • 260 mensajes

Escrito 04 junio 2015 - 09:10

Muchas Gracias amigo "Escafandra" :)


  • 0




IP.Board spam blocked by CleanTalk.