![Foto](http://delphiaccess.com/foros/uploads/profile/photo-thumb-12377.png?_r=1489003810)
Como obtener los nombres de las carpetas y pasarlos a una lista?
#1
Escrito 29 junio 2010 - 01:37
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
#2
Escrito 29 junio 2010 - 03:50
#3
Escrito 29 junio 2010 - 04:07
procedure ListFolder(Dir:String; Salida: TStrings); var sr: TSearchRec; begin if FindFirst(Dir + '\*.*', faAnyFile, sr) = 0 then repeat if (sr.Name <> '.') and (sr.Name <> '..') then begin if (sr.Attr and faDirectory)<>0 then begin // Para añadir la carpeta actual Salida.Add(Dir + '\' + sr.Name); // Para añadir subcarpetas ListFolder(Dir + '\' + sr.Name, Salida); end; end; until FindNext(sr)<>0; FindClose(sr); end;
Espero que sea esto lo que precisas.
![;)](http://delphiaccess.com/foros/public/style_emoticons/default/15.gif)
Saludos.
#4
Escrito 30 junio 2010 - 07:04
Probé primero la opcion de escafandra, pero me da este error (adjunto imagen), en esta linea
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é
procedure TForm1.btn1Click(Sender: TObject); var Lista: TStrings; begin ListFolder('c:', Lista); mmo1.Lines:=Lista; end;
#5
Escrito 30 junio 2010 - 07:08
![*-)](http://delphiaccess.com/foros/public/style_emoticons/default/07.gif)
Archivos adjuntos
#6
Escrito 30 junio 2010 - 08:00
Salidas := TStrings.Create; // Llamar la función Salidas.Free;
Saludox !
![:)](http://delphiaccess.com/foros/public/style_emoticons/default/27.gif)
#7
Escrito 30 junio 2010 - 08:57
var
Lista: TStrings;
begin
Lista := TStrings.Create;
....
Dará unos cuantos warnings de tipo Abstract Error.
![(h)](http://delphiaccess.com/foros/public/style_emoticons/default/11.gif)
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.
![;)](http://delphiaccess.com/foros/public/style_emoticons/default/15.gif)
La solución: emplear una clase descendiente de ésta, como por ejemplo TStringList.
Saludos,
#8
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.
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)](http://delphiaccess.com/foros/public/style_emoticons/default/17.gif)
Saludox !
![:)](http://delphiaccess.com/foros/public/style_emoticons/default/27.gif)
#9
Escrito 30 junio 2010 - 09:07
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:
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,
#10
Escrito 30 junio 2010 - 10:40
procedure TForm1.Button1Click(Sender: TObject); var Lista: TStringList; begin Lista:= TStringList.Create; ListFolder('C:\Comp\', Lista); Memo1.Lines:=Lista; Lista.Free; end;
Pero en realidad, como dice Delphius, si vamos a usar un TMemo, por ejemplo, lo mejor es hacerlo así:
procedure TForm1.Button1Click(Sender: TObject); begin ListFolder('C:\Comp\', Memo1.Lines); end;
Cierto, o mejor aún meter el código en un thread aparte...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.
#11
Escrito 30 junio 2010 - 11:51
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:](http://delphiaccess.com/foros/public/style_emoticons/default/undecided.gif)
#12
Escrito 30 junio 2010 - 11:55
El problema me lo encontre en como pasarlo para el Memo o para un StringList, pues me da incompatibilidad de Tipos
![:(](http://delphiaccess.com/foros/public/style_emoticons/default/10.gif)
#13
Escrito 30 junio 2010 - 12:35
procedure ListFolder(Dir:String; Salida: TStrings); var sr: TSearchRec; begin if FindFirst(Dir + '\*.*', faAnyFile, sr) = 0 then repeat if (sr.Name <> '.') and (sr.Name <> '..') then begin if (sr.Attr and faDirectory)<>0 then begin Application.ProcessMessages; // <<=======<< // Para añadir la carpeta actual Salida.Add(Dir + '\' + sr.Name); // Para añadir subcarpetas ListFolder(Dir + '\' + sr.Name, Salida); end; end; until FindNext(sr)<>0; FindClose(sr); end;
Saludos.