Ir al contenido


Foto

Como obtener los nombres de las carpetas y pasarlos a una lista?


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

#1 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 775 mensajes
  • LocationPinar del Río, Cuba

Escrito 29 junio 2010 - 01:37

Hola a todos
Estuve buscando en el foro, y lo que encontre fue la busqueda de archivos dentro de una carpeta, pero no se ajusta a lo que necesito

Lo que deseo es el listado de las carpetas dentro de una ubicacion especifica, para pasarlo a una lista, y agregarlas a un archivo de texto. Solo las carpetas, los archivos no me interesan

El objetivo es explorar la Carpeta especificada (Ejem: D:\EstaCarpeta\) y buscar todas las carpetas que contenga para tomarle el nombre y agregarlo en una lista de un archivo de texto (la agrego solo si no existe ya en la lista)

Opcionalmente, podria obtener tambien la cantidad de archivos de cada carpeta

Nota: En (D:\EstaCarpeta\) solo van a haber carpetas

  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.456 mensajes
  • LocationMéxico

Escrito 29 junio 2010 - 03:50

Hola

A ver si esto te sirve

http://www.delphi300...le_1723.asp?SK=

Salud OS
  • 0

#3 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.108 mensajes
  • LocationMadrid - España

Escrito 29 junio 2010 - 04:07

Te pongo un ejemplo sencillo pero eficaz para listar carpetas y/o subcarpetas:


delphi
  1. procedure ListFolder(Dir:String; Salida: TStrings);
  2. var
  3.   sr: TSearchRec;
  4. begin
  5.     if FindFirst(Dir + '\*.*', faAnyFile, sr) = 0 then
  6.     repeat
  7.       if (sr.Name <> '.') and (sr.Name <> '..') then
  8.       begin
  9.           if (sr.Attr and faDirectory)<>0 then
  10.           begin
  11.             // Para añadir la carpeta actual
  12.             Salida.Add(Dir + '\' + sr.Name);
  13.             // Para añadir subcarpetas
  14.             ListFolder(Dir + '\' + sr.Name, Salida);
  15.           end;
  16.       end;
  17.     until FindNext(sr)<>0;
  18.     FindClose(sr);
  19. end;



Espero que sea esto lo que precisas. ;)

Saludos.
  • 0

#4 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 775 mensajes
  • LocationPinar del Río, Cuba

Escrito 30 junio 2010 - 07:04

Gracias por sus respuestas

Probé primero la opcion de escafandra, pero me da este error (adjunto imagen), en esta linea


delphi
  1. Salida.Add(Dir + '\' + sr.Name);



lo unico que agregué extra fue esto, aunque pienso que no tenga nada que ver con el error, no sé



delphi
  1. procedure TForm1.btn1Click(Sender: TObject);
  2. var
  3.   Lista: TStrings;
  4.  
  5. begin
  6.   ListFolder('c:', Lista);
  7.   mmo1.Lines:=Lista;
  8. end;


  • 0

#5 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 775 mensajes
  • LocationPinar del Río, Cuba

Escrito 30 junio 2010 - 07:08

habia olvidado poner la imagen  *-)

Archivos adjuntos


  • 0

#6 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 30 junio 2010 - 08:00

Jejejejeje... lo que pasa esque elobjetoSalidas no ha sido creado.... desde donde mandas llamar la función ListFolder debes crear el TSrings:



delphi
  1. Salidas := TStrings.Create;
  2. // Llamar la función
  3. Salidas.Free;



Saludox ! :)





  • 0

#7 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 30 junio 2010 - 08:57

Yo estoy 99.9999% seguro que el declarar la variable de tipo TStrings e intentar crearla:

var
Lista: TStrings;
begin
Lista := TStrings.Create;
....

Dará unos cuantos warnings de tipo Abstract Error.    (h)

El motivo: La clase TStrings es una clase abstracta y un intento de crearla es un error conceptual. Como clase abstracta sirve para operaciones polifórmicas; carece de total sentido crear una entidad abstracta. Uno no sale a crear un animal... creará perros, gatos, ballenas en todo caso.  ;)

La solución: emplear una clase descendiente de ésta, como por ejemplo TStringList.

Saludos,
  • 0

#8 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 30 junio 2010 - 09:01

Yo estoy 99.9999% seguro que el declarar la variable de tipo TStrings e intentar crearla:

var
Lista: TStrings;
begin
Lista := TStrings.Create;
....

Dará unos cuantos warnings de tipo Abstract Error.    (h)

El motivo: La clase TStrings es una clase abstracta y un intento de crearla es un error conceptual. Como clase abstracta sirve para operaciones polifórmicas; carece de total sentido crear una entidad abstracta. Uno no sale a crear un animal... creará perros, gatos, ballenas en todo caso.  ;)

La solución: emplear una clase descendiente de ésta, como por ejemplo TStringList.

Saludos,


Muy pero muy pero muy cierto... de hecho hace poco me ha ocurrido este problema y lo he solucionado así.... creando mi objeto tal y como mencionas...

Gracias por la correción amigo Delph ! (y)

Saludox ! :)
  • 0

#9 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 30 junio 2010 - 09:07

No hay de que, amiga.

Ahora, si me lo permiten... incluso no hay necesidad de declarar una variable auxiliar. Se puede pasar directamente el Items de cualquier ListBox, Memo o cualquier otro objeto que sea TStrings.

Por ejemplo:



delphi
  1. ListFolder('C:\',ListBox1.Items);



NOTA: No se olviden de que si crean un objeto, luego hay que liberarlo.

EDITO:
No estaría demás, un ProcessMesages para darle un respiro a la máquina. Explorar, por lo general un C:\ toma un buen tiempo.

Saludos,
  • 0

#10 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.108 mensajes
  • LocationMadrid - España

Escrito 30 junio 2010 - 10:40

Ciertamente el error está en no haber creado el objeto Lista (como apuntan Fenareth y Delphius), éste debe ser de la clase TStringList que no es abstracta:


delphi
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var
  3.   Lista: TStringList;
  4. begin
  5.   Lista:= TStringList.Create;
  6.   ListFolder('C:\Comp\', Lista);
  7.   Memo1.Lines:=Lista;
  8.   Lista.Free;
  9. end;



Pero en realidad, como dice Delphius, si vamos a usar un TMemo, por ejemplo, lo mejor es hacerlo así:


delphi
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. begin
  3.   ListFolder('C:\Comp\', Memo1.Lines);
  4. end;



No estaría demás, un ProcessMesages para darle un respiro a la máquina. Explorar, por lo general un C:\ toma un buen tiempo.

Cierto, o mejor aún meter el código en un thread aparte...


Saludos.
  • 0

#11 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 775 mensajes
  • LocationPinar del Río, Cuba

Escrito 30 junio 2010 - 11:51

Pues como no sabia bien lo del error, lo mandé directo para el Memo, y ahora veo que Delphius lo recomendó

Por cierto cuando lo probé se extendió un poco, pero ya sé que asi funciona
Y para resolver esto, es con:

No estaría demás, un ProcessMesages para darle un respiro a la máquina. Explorar, por lo general un C:\ toma un buen tiempo.


Pero nunca he usado ProcessMesages  :undecided:


  • 0

#12 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 775 mensajes
  • LocationPinar del Río, Cuba

Escrito 30 junio 2010 - 11:55

Tambien probé la respuesta de egostar, (por cierto un poco complicada usando punteros), y al final me lo guarda en un  TList

El problema me lo encontre en como pasarlo para el Memo o para un StringList, pues me da incompatibilidad de Tipos  :(
  • 0

#13 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.108 mensajes
  • LocationMadrid - España

Escrito 30 junio 2010 - 12:35




delphi
  1. procedure ListFolder(Dir:String; Salida: TStrings);
  2. var
  3.   sr: TSearchRec;
  4. begin
  5.     if FindFirst(Dir + '\*.*', faAnyFile, sr) = 0 then
  6.     repeat
  7.       if (sr.Name <> '.') and (sr.Name <> '..') then
  8.       begin
  9.           if (sr.Attr and faDirectory)<>0 then
  10.           begin
  11.             Application.ProcessMessages;  // <<=======<<
  12.             // Para añadir la carpeta actual
  13.             Salida.Add(Dir + '\' + sr.Name);
  14.             // Para añadir subcarpetas
  15.             ListFolder(Dir + '\' + sr.Name, Salida);
  16.           end;
  17.       end;
  18.     until FindNext(sr)<>0;
  19.     FindClose(sr);
  20. end;



Saludos.
  • 0




IP.Board spam blocked by CleanTalk.