Ir al contenido


Foto

Buscar Archivos en Carpetas y sub-Carpetas con filtros


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

#1 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 16 diciembre 2008 - 09:40

Hola amigos, ando buscando un código donde busque archivos en carpetas y sub-carpetas mediante filtros, me explico, selecciono una carpeta y quiero que me busque dentro de ella archivos .Mp3, .Wma y .Mp4 y también sus subcarpetas, el objetivo es que al seleccionar una carpeta me vaya agregando en un DBGrid u otro componente similar y leer los IDv3 mientras la agrega, ya esa parte me encargo, ¿alguien conoce algún código de ese tipo?.

Saludos.
  • 0

#2 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 16 diciembre 2008 - 11:50

Bueno, tengo lo siguiente, lo hice de memoria era un codigo que me facilitaron hace un tiempo y no lo encontraba, le agregué unas cuantas cosas para mi objetivo, lo logré, en este caso usé un ComboBox:



delphi
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var
  3.   TS:TStrings;
  4.   i:Integer;
  5.  
  6.  
  7.   procedure ArchivosDirectorio(dir, mascara: string;
  8.     var lista: TStrings; const soloNombres: boolean);
  9.   var
  10.     SR: TSearchRec;
  11.   begin
  12.     dir := IncludeTrailingPathDelimiter(dir);
  13.     if FindFirst(dir + mascara, faAnyFile, SR) = 0 then
  14.     begin
  15.       repeat
  16.         if not soloNombres then
  17.           lista.Add(ExtractFileName(ChangeFileExt(dir + SR.Name, '')))
  18.         else
  19.           lista.Add(dir + SR.Name);
  20.       until FindNext(SR) <> 0;
  21.       SysUtils.FindClose(SR);
  22.     end;
  23.   end;
  24.  
  25. begin
  26.  
  27. Carpeta.Execute;
  28.  
  29. if Carpeta.Directory <> '' then
  30.   begin
  31.   TS := TStringList.Create();
  32.   try
  33.     ArchivosDirectorio(Carpeta.Directory, '*.pas', TS, True);
  34.  
  35.     for i := 0 to (TS.Count - 1) do begin
  36.       TS.Strings[i] := ExtractFileName(TS.Strings[i]);
  37.     end;
  38.  
  39.  
  40.     ComboBox1.Items.Clear;
  41.     ComboBox1.Items.AddStrings(TS);
  42.     ComboBox1.ItemIndex := 0;
  43.  
  44.   finally
  45.     FreeAndNil(TS);
  46.   end;
  47. end;
  48. end;



Dos cosas:

1) Necesito lograr agregar más formatos, o sea, que sea multiformato.
2) Que me lea las sub-carpetas, no logro conseguirlo.

Saludos.
  • 0

#3 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 22 diciembre 2008 - 09:52

Vamos chicos, ¿nadie me puede ayudar con este asunto? :(

Saludos.
  • 0

#4 Delphius

Delphius

    Advanced Member

  • Moderador
  • PipPipPip
  • 6.295 mensajes
  • LocationArgentina

Escrito 22 diciembre 2008 - 12:47

Hola amigo, JM en su sitio habló de un componente que él hizo que sirve para buscar archivos. Puede trabajar con uno o varios formatos, además explora las subcarpetas. El componente se llama TBuscador.

El problema está en que el sitio de JM actualmente está fuera de servicio :(. Ya me fijo si es que todavía lo tengo. Sino será cuestión de buscar si está disponible la descarga de dicho componente en algún otro sitio o alguno otro parecido.

Por lo que veo en dicho código, tal vez se pueda modificar el parametro mascara para que sea un TStrings y valerse de éste TStrings para recorrer todos sus items cuando se lo compara en el FindFirst(). La idea que se me ocurre es que pasamos la lista con todos los formatos.

Algo así:



delphi
  1. procedure ArchivosDirectorio(dir, mascaras: TStrings; var lista: TStrings; const soloNombres: boolean);



Y en la parte de la comparación en el FindFirst hacer algo como esto:



delphi
  1. for i := 0 to mascaras.Count - 1 do
  2.   if FindFirst(dir + mascaras[i], faAnyFile, SR) = 0 then ...



Como hacer para buscar en subcarpetas ya me tengo que poner a repasar bien esto. Disculpa.

Saludos,
 




  • 0

#5 seoane

seoane

    Advanced Member

  • Moderador
  • PipPipPip
  • 1.257 mensajes
  • LocationEspaña

Escrito 22 diciembre 2008 - 05:03

La busqueda en subdirectorios es un ejemplo tipico de funcion recursiva.

Por ejemplo:


delphi
  1. procedure Buscar(Lista: TStringList; Path, Mascara: String); overload;
  2. var
  3.   SR: TSearchRec;
  4. begin
  5.   Path:= IncludeTrailingPathDelimiter(Path);
  6.   if FindFirst(Path + '*.*', faAnyfile, SR) = 0 then
  7.   repeat
  8.     if (SR.Name <>  '.') and (SR.Name <> '..') then
  9.       if (SR.Attr and faDirectory) = faDirectory then
  10.         Buscar(Lista,Path+SR.Name,Mascara);
  11.   until FindNext(SR) <> 0;
  12.   FindClose(SR);
  13.   if FindFirst(Path + Mascara, faAnyfile, SR) = 0 then
  14.   repeat
  15.     if (SR.Name <>  '.') and (SR.Name <> '..') then
  16.       if (SR.Attr and faDirectory) <> faDirectory then
  17.         Lista.Add(Path + SR.Name);
  18.   until FindNext(SR) <> 0;
  19.   FindClose(SR);
  20. end;
  21.  
  22. // Ejemplo de uso
  23. var
  24.   Lista: TStringList;
  25. begin
  26.   Lista:= TStringList.Create;
  27.   try
  28.     Buscar(Lista,'c:\windows\web','*.jpg');
  29.     ShowMessage(Lista.Text);
  30.   finally
  31.     Lista.Free;
  32.   end;
  33. end;



Y si tenemos mas de una mascara solo se me ocurre buscar varias veces:


delphi
  1. procedure Buscar(Lista: TStringList; Path, Mascara: String); overload;
  2. var
  3.   SR: TSearchRec;
  4. begin
  5.   Path:= IncludeTrailingPathDelimiter(Path);
  6.   if FindFirst(Path + '*.*', faAnyfile, SR) = 0 then
  7.   repeat
  8.     if (SR.Name <>  '.') and (SR.Name <> '..') then
  9.       if (SR.Attr and faDirectory) = faDirectory then
  10.         Buscar(Lista,Path+SR.Name,Mascara);
  11.   until FindNext(SR) <> 0;
  12.   FindClose(SR);
  13.   if FindFirst(Path + Mascara, faAnyfile, SR) = 0 then
  14.   repeat
  15.     if (SR.Name <>  '.') and (SR.Name <> '..') then
  16.       if (SR.Attr and faDirectory) <> faDirectory then
  17.         Lista.Add(Path + SR.Name);
  18.   until FindNext(SR) <> 0;
  19.   FindClose(SR);
  20. end;
  21.  
  22. procedure Buscar(Lista: TStringList; Path: String; Mascaras: TStringList); overload;
  23. var
  24.   i: Integer;
  25. begin
  26.   for i:= 0 to Mascaras.Count - 1 do
  27.     Buscar(Lista,Path,Mascaras[i]);
  28. end;
  29.  
  30. // Ejemplo de uso
  31. procedure TForm1.Button1Click(Sender: TObject);
  32. var
  33.   Lista: TStringList;
  34.   Mascaras: TStringList;
  35. begin
  36.   Lista:= TStringList.Create;
  37.   try
  38.     Mascaras:= TStringList.Create;
  39.     try
  40.       Mascaras.Add('*.jpg');
  41.       Mascaras.Add('*.bmp');
  42.       Buscar(Lista,'c:\windows\web',Mascaras);
  43.     finally
  44.       Mascaras.Free;
  45.     end;
  46.     ShowMessage(Lista.Text);
  47.   finally
  48.     Lista.Free;
  49.   end;
  50. end;




  • 0

#6 Delphius

Delphius

    Advanced Member

  • Moderador
  • PipPipPip
  • 6.295 mensajes
  • LocationArgentina

Escrito 22 diciembre 2008 - 05:06

Bueno Fernando, encontré entre mis cosas la carpeta donde tengo los archivos del componente. Lo zipié , hago para adjuntarlo, quiero publicar el mensaje y no me deja. :s
Me dice que hubo un error al intentar adjuntar el archivo. Pensé que era el tamaño pero son 20K.

Saludos,
  • 0

#7 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 22 diciembre 2008 - 05:08

mmmm, eso está raro amigo, déjame revisar eso, seoane, haré la prueba de tu código, luego te comento.

Saludos.
  • 0

#8 Delphius

Delphius

    Advanced Member

  • Moderador
  • PipPipPip
  • 6.295 mensajes
  • LocationArgentina

Escrito 22 diciembre 2008 - 05:16

La busqueda en subdirectorios es un ejemplo tipico de funcion recursiva.


Y si tenemos mas de una mascara solo se me ocurre buscar varias veces:


delphi
  1. procedure Buscar(Lista: TStringList; Path, Mascara: String); overload;
  2. var
  3.   SR: TSearchRec;
  4. begin
  5.   Path:= IncludeTrailingPathDelimiter(Path);
  6.   if FindFirst(Path + '*.*', faAnyfile, SR) = 0 then
  7.   repeat
  8.     if (SR.Name <>  '.') and (SR.Name <> '..') then
  9.       if (SR.Attr and faDirectory) = faDirectory then
  10.         Buscar(Lista,Path+SR.Name,Mascara);
  11.   until FindNext(SR) <> 0;
  12.   FindClose(SR);
  13.   [b]if FindFirst(Path + Mascara, faAnyfile, SR)[/b] = 0 then
  14.   repeat
  15.     if (SR.Name <>  '.') and (SR.Name <> '..') then
  16.       if (SR.Attr and faDirectory) <> faDirectory then
  17.         Lista.Add(Path + SR.Name);
  18.   until FindNext(SR) <> 0;
  19.   FindClose(SR);
  20. end;
  21.  
  22. procedure Buscar(Lista: TStringList; Path: String; Mascaras: TStringList); overload;
  23. var
  24.   i: Integer;
  25. begin
  26.   for i:= 0 to Mascaras.Count - 1 do
  27.     Buscar(Lista,Path,Mascaras[i]);
  28. end;
  29.  
  30. // Ejemplo de uso
  31. procedure TForm1.Button1Click(Sender: TObject);
  32. var
  33.   Lista: TStringList;
  34.   Mascaras: TStringList;
  35. begin
  36.   Lista:= TStringList.Create;
  37.   try
  38.     Mascaras:= TStringList.Create;
  39.     try
  40.       Mascaras.Add('*.jpg');
  41.       Mascaras.Add('*.bmp');
  42.       Buscar(Lista,'c:\windows\web',Mascaras);
  43.     finally
  44.       Mascaras.Free;
  45.     end;
  46.     ShowMessage(Lista.Text);
  47.   finally
  48.     Lista.Free;
  49.   end;
  50. end;




Hola Domingo no he probado el código, pero ¿no se puede evitar lanzar múltiples búsquedas y directamente poner el for antes del FinFirst? Algo como lo que decía unos post antes:



delphi
  1. for i := 0 to mascaras.Count - 1 do
  2.   if FindFirst(Path + mascaras[i] ...



Contra un:



delphi
  1. for i := 0 to mascaras.Count - 1 do
  2.   Buscar(....)



Nomás es una duda que me asalta.

Saludos,
  • 0

#9 seoane

seoane

    Advanced Member

  • Moderador
  • PipPipPip
  • 1.257 mensajes
  • LocationEspaña

Escrito 22 diciembre 2008 - 05:23

Pues claro Delphius, eso seria mucho mas eficiente:


delphi
  1. procedure Buscar(Lista: TStringList; Path: String; Mascaras: TStringList);
  2. var
  3.   i: Integer;
  4.   SR: TSearchRec;
  5. begin
  6.   Path:= IncludeTrailingPathDelimiter(Path);
  7.   if FindFirst(Path + '*.*', faAnyfile, SR) = 0 then
  8.   repeat
  9.     if (SR.Name <>  '.') and (SR.Name <> '..') then
  10.       if (SR.Attr and faDirectory) = faDirectory then
  11.         Buscar(Lista,Path+SR.Name,Mascaras);
  12.   until FindNext(SR) <> 0;
  13.   FindClose(SR);
  14.   for i:= 0 to Mascaras.Count - 1 do
  15.   begin
  16.     if FindFirst(Path + Mascaras[i], faAnyfile, SR) = 0 then
  17.     repeat
  18.       if (SR.Name <>  '.') and (SR.Name <> '..') then
  19.         if (SR.Attr and faDirectory) <> faDirectory then
  20.           Lista.Add(Path + SR.Name);
  21.     until FindNext(SR) <> 0;
  22.     FindClose(SR);
  23.   end;
  24. end;


  • 0

#10 cHackAll

cHackAll

    Advanced Member

  • Moderador
  • PipPipPip
  • 598 mensajes

Escrito 22 diciembre 2008 - 06:23

Aunque es una solucion totalmente aceptable, dare MIs dos puntos en contra del anterior codigo;

  • Aunque la informacion haya sido almacenada en caché, el segundo listado (bucle FindFirst) produce un numero de llamadas "duplicadas"
  • Usar una clase TStringsList como máscara amerita manejo de datos y de la clase en si

Aunque prefiero no usar "concatenación" de cadenas y metodos SysUtils, dejo e siguiente código por ser mas comprensible.



delphi
  1. procedure TForm1.Process(Path: string; const Mask: string);
  2. var sr: TSearchRec;
  3. begin
  4. Path := Path + PathDelim;
  5. if FindFirst(Path + '*.*', faAnyFile, sr) = 0 then
  6.   begin
  7.   repeat
  8.     if (sr.Attr and faDirectory) <> 0 then
  9.     if (sr.Name <> '.') and (sr.Name <> '..') then
  10.       Process(Path + sr.Name, Mask)
  11.     else
  12.     else
  13.     if Pos(ExtractFileExt(sr.Name) + '.', '.' + Mask + '.') > 1 then
  14.       ListBox1.AddItem(Path + sr.Name, nil);
  15.   until FindNext(sr) <> 0;
  16.   FindClose(sr);
  17.   end;
  18. end;
  19.  
  20. procedure TForm1.Button1Click(Sender: TObject);
  21. begin
  22. Process('c:', '.exe.com.dll.sys');
  23. end;



Saludos
  • 0

#11 seoane

seoane

    Advanced Member

  • Moderador
  • PipPipPip
  • 1.257 mensajes
  • LocationEspaña

Escrito 23 diciembre 2008 - 08:21

Ya había pensado en esa solución chackall, pero y si queremos usar una mascara como esta "uno*.jp*"
  • 0

#12 Caral

Caral

    Advanced Member

  • Administrador
  • 4.265 mensajes
  • LocationCosta Rica

Escrito 23 diciembre 2008 - 08:51

Hola
Esto se pone bueno, duelo de titanes. (y)
Saludos
  • 0

#13 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 05 julio 2009 - 11:36

Hace tiempo habí­a probado con el code que propuso mi estimado ChackAll en el post #9 y me ha funcionado perfecto, pero hay un asunto y es que deja un efecto no muy agradable y es que mientras se realiza la búsqueda el aplicativo aparenta estar congelado y no puedo moverla o minimizarla, he usado el Busy de ChackAll pero aún no puedo minimizarlo o mover el formulario, ¿hay alguna otra manera de resolver ese problema?.

Saludos.
  • 0

#14 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 05 julio 2009 - 06:53

Estoy teniendo problemas con el code con unos agregados que he hecho, queda así­:



delphi
  1. procedure TForm1.Process(Path: string; const Mask: string);
  2. var sr: TSearchRec;
  3.     Artista, Album, Titulo, Ano, Calidad, Genero, Comentario: String;
  4. begin
  5. Path := Path + PathDelim;
  6. if FindFirst(Path + '*.*', faAnyFile, sr) = 0 then
  7.   begin
  8.   repeat
  9.     if (sr.Attr and faDirectory) <> 0 then
  10.     if (sr.Name <> '.') and (sr.Name <> '..') then
  11.       Process(Path + sr.Name, Mask)
  12.     else
  13.     else
  14.     if Pos(ExtractFileExt(sr.Name) + '.', '.' + Mask + '.') > 1 then
  15.       ObtenerID3Tag((path + sr.Name),Titulo,Artista,Album,Ano,Genero,Comentario);
  16.     if cdsCanciones.Active = False then
  17.       cdsCanciones.Open;
  18.     {*** registramos en el XML ***} 
  19.       cdsCanciones.Append;
  20.       cdsCanciones.FieldByName('ID').AsInteger      := cdsCanciones.RecordCount + 1;
  21.       cdsCanciones.FieldByName('Artista').AsString  := Artista;
  22.       if Titulo <> '' then
  23.       cdsCanciones.FieldByName('Titulo').AsString  := Titulo
  24.       else
  25.       cdsCanciones.FieldByName('Titulo').AsString  := sr.Name;
  26.      
  27.       cdsCanciones.FieldByName('Album').AsString    := Ano;
  28.       cdsCanciones.FieldByName('Genero').AsString  := Genero;
  29.       cdsCanciones.FieldByName('Ano').AsInteger    := StrToIntDef(Album,0);
  30.       cdsCanciones.FieldByName('Calidad').AsInteger := StrToIntDef(Calidad,0);
  31.       cdsCanciones.FieldByName('Ruta').AsString    := Path + sr.Name;
  32.       cdsCanciones.Post;
  33.   until FindNext(sr) <> 0;
  34.   FindClose(sr);
  35.   end;
  36. end;



Y lo ejecuto con una sola Máscaras así­:



delphi
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. begin
  3. Process('C:', '.mp3');
  4. end;



Pero me busca todos los archivos sin importar la(s) máscara(s), a ver, ¿qué estoy haciendo mal? ^o|.

Saludos.

PD. Anexo una imagen del resultado.
  • 0

#15 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.259 mensajes
  • LocationMéxico

Escrito 05 julio 2009 - 08:16

Hola

Y no será por esto ????



delphi
  1. if FindFirst(Path + '*.*', faAnyFile, sr) = 0 then




No deberia ser:



delphi
  1. if FindFirst(Path + '*'+Mask, faAnyFile, sr) = 0 then



Salud OS
  • 0

#16 Delphius

Delphius

    Advanced Member

  • Moderador
  • PipPipPip
  • 6.295 mensajes
  • LocationArgentina

Escrito 05 julio 2009 - 10:22

Ups... veo que no habí­a subido el componente :s ...

El componente al que me referí­a es el que adjunto. Pertenece a JM (Juan Manuel), un desarrollador español.
Hace tiempo que no volví­a a pasearme por la web de JM... acabo de darme un paseo y me doy con que expiró :( . Era un sitio estupendo.

No se hasta que punto es "legal".


Saludos,

Archivos adjuntos


  • 0

#17 cHackAll

cHackAll

    Advanced Member

  • Moderador
  • PipPipPip
  • 598 mensajes

Escrito 06 julio 2009 - 07:49

Hace tiempo habí­a probado con el code que propuso mi estimado ChackAll en el post #9 y me ha funcionado perfecto, pero hay un asunto y es que deja un efecto no muy agradable y es que mientras se realiza la búsqueda el aplicativo aparenta estar congelado y no puedo moverla o minimizarla, he usado el Busy de ChackAll pero aún no puedo minimizarlo o mover el formulario, ¿hay alguna otra manera de resolver ese problema?...


En éste caso la respuesta más acertada es separar el algoritmo de búsqueda de la interfaz (dejando a un lado la unidad Busy para otros casos más especí­ficos). Mientras la velocidad del hilo estará dada por la velocidad de acceso a la información en el medio de almacenamiento, podremos mostrar una animación a una velocidad constante y distinta de la primera.

Para no enredarnos con clases y para facilitar lo anteriormente dicho utilizaremos la API CreateThread adaptando el procedimiento Process (ahora Search);



delphi
  1. var
  2. Path: array [0..MAX_PATH] of Char; // {MAX_PATH + 1} para asegurar que el último carácter sea #0
  3. FindFileData: TWin32FindData; // es global para disminuir el “proceso en pila”
  4.  
  5. procedure Search(const lpString: PChar); stdcall; // hilo recursivo
  6. var
  7. len, hFindHandle: Cardinal;
  8. lpFileName, lpExt: PChar;
  9. begin
  10. len := lstrlen(@Path) + 1; // solo usaremos una variable de 32 bits para manejar las rutas
  11. hFindHandle := FindFirstFile(lstrcat(@Path, '\*.*'), FindFileData); // concatenamos e iniciamos la “busqueda”
  12. if hFindHandle <> INVALID_HANDLE_VALUE then
  13.   begin
  14.   repeat lpFileName := @FindFileData.cFileName; lstrcpy(@Path[len], lpFileName); // concatenamos la ruta con el nombre del archivo
  15.     if (FindFileData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) <> 0 then // si es una carpeta
  16.     if (PWord(lpFileName)^ <> Ord('.')) and (PWord(@lpFileName[1])^ <> Ord('.')) then // “procesable” entonces
  17.       Search(lpString) // la procesamos.
  18.     else
  19.     else
  20.     begin
  21.       lpExt := lpFileName;
  22.       while lpFileName[0] <> #0 do
  23.       begin
  24.         if lpFileName[0] = '.' then
  25.         lpExt := lpFileName; // extraemos la extensión del archivo
  26.         Inc(lpFileName);
  27.       end;
  28.       PWord(lpFileName)^ := Ord('.'); // le “aumentamos” un punto al final para delimitar su búsqueda (Ej. '.exe.')
  29.       if Assigned(strstr(lpString, _strlwr(lpExt))) then // y buscamos dicha extensión en la “lista”
  30.       Form1.ListBox1.AddItem(Path, nil); // agregamos dicha ocurrencia a la lista de archivos
  31.     end;
  32.   until not FindNextFile(hFindHandle, FindFileData);
  33.   Windows.FindClose(hFindHandle);
  34.   end;
  35. end;
  36.  
  37. procedure TForm1.Button1Click(Sender: TObject);
  38. begin
  39. ListBox1.Clear; // limpiamos la lista
  40. lstrcpy(@Path, 'c:'); // e inicializamos la ruta de búsqueda, la cual es global para acceder desde “fuera del hilo”.
  41. // Finalmente creamos el hilo el cual al ser un procedimiento se llamará recursivamente. El parámetro ha de ser
  42. // la “lista” de extensiones a buscar con un punto extra al final. Timer1.Tag es definido con el identificador del hilo
  43. // para que él mismo “sepa” cuando el hilo ha terminado la búsqueda.
  44. Timer1.Tag := CreateThread(nil, 0{}, @Search, PChar('.dll.exe.sys.bat.vbs.cmd.com.'), 0, PDWORD(0)^);
  45. Button1.Visible := False; // ocultamos el botón para que no sea llamado dos veces
  46. Timer1.Enabled := True; // e iniciamos el Timer1 para mostrar algún tipo de animación y que al finalizar el mismo “reactive” el botón.
  47. end;



En el adjunto está el código completo y un ejemplo sencillo de “animación”, incluyendo la finalizacion del hilo en caso de cerrarse la aplicación.

 

...Y lo ejecuto con una sola Máscaras así­:



delphi
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. begin
  3. Process('C:', '.mp3');
  4. end;



Pero me busca todos los archivos sin importar la(s) máscara(s), a ver, ¿qué estoy haciendo mal? ^o|...


Se te esta olvidando un begin y end en cuando la extensión es reconocida; este olvido esta provocando que todos los archivos y carpetas sean procesados en el XML;



delphi
  1. procedure TForm1.Process(Path: string; const Mask: string);
  2. var sr: TSearchRec; Artista, Album, Titulo, Ano, Calidad, Genero, Comentario: string;
  3. begin
  4. Path := Path + PathDelim;
  5. if FindFirst(Path + '*.*', faAnyFile, sr) = 0 then
  6.   begin
  7.   repeat
  8.     if (sr.Attr and faDirectory) <> 0 then
  9.     if (sr.Name <> '.') and (sr.Name <> '..') then
  10.       Process(Path + sr.Name, Mask)
  11.     else
  12.     else
  13.     if Pos(ExtractFileExt(sr.Name) + '.', '.' + Mask + '.') > 1 then
  14.       begin // ESTE !!!
  15.       ObtenerID3Tag((path + sr.Name),Titulo,Artista,Album,Ano,Genero,Comentario);
  16.       if cdsCanciones.Active = False then
  17.         cdsCanciones.Open;
  18.       {*** registramos en el XML ***} 
  19.       cdsCanciones.Append;
  20.       cdsCanciones.FieldByName('ID').AsInteger      := cdsCanciones.RecordCount + 1;
  21.       cdsCanciones.FieldByName('Artista').AsString  := Artista;
  22.       if Titulo <> '' then
  23.         cdsCanciones.FieldByName('Titulo').AsString  := Titulo
  24.       else
  25.         cdsCanciones.FieldByName('Titulo').AsString  := sr.Name;
  26.       cdsCanciones.FieldByName('Album').AsString    := Ano;
  27.       cdsCanciones.FieldByName('Genero').AsString  := Genero;
  28.       cdsCanciones.FieldByName('Ano').AsInteger    := StrToIntDef(Album, 0);
  29.       cdsCanciones.FieldByName('Calidad').AsInteger := StrToIntDef(Calidad, 0);
  30.       cdsCanciones.FieldByName('Ruta').AsString    := Path + sr.Name;
  31.       cdsCanciones.Post;
  32.       end; // ESTE!!!
  33.     until FindNext(sr) <> 0;
  34.   FindClose(sr);
  35.   end;
  36. end;



Salud!
  • 0

#18 rgstuamigo

rgstuamigo

    Member

  • Miembros
  • PipPip
  • 32 mensajes
  • LocationSanta Cruz-Bolivia

Escrito 06 julio 2009 - 01:54

Yo no se por que tanto se complican  *-),sabiendo que delphi ya posee componentes para tal ;)
Amigo Enecumene, has lo siguiente:
1.-Arrastrate un TFileListBox(pestaña Win3.1 de la paleta de componente)
2.-Pon en su propiedad Mask la mascara  por ejemplo C:\Mi\Ruta\Completa\*.MP3  y listo ya tiene listado todos los archivos en el FileListBox y sin codificar nada, por supueto que este componente utiliza las funciones FindFirst y FindNext internamente. ;)
Saludos... (y)
  • 0

#19 cHackAll

cHackAll

    Advanced Member

  • Moderador
  • PipPipPip
  • 598 mensajes

Escrito 06 julio 2009 - 02:18

Yo no se por que tanto se complican  *-),sabiendo que delphi ya posee componentes para tal ;)...


Aunque la respuesta corta serí­a que nos gusta quemar neuronas en vano, la respuesta larga esta relacionada con recursividad; mientras que el descrito inicialmente nos retornará una lista con todos los archivos que concuerden con una lista extensiones en una ruta determinada y todas sus subcarpetas, tu solución solo retornara la ocurrencia de una mascara en una carpeta (y no así­ de las carpetas que estén dentro de ésta) ver siguiente ejemplo sin componentes;



delphi
  1. ListBox1.Perform(LB_DIR, DDL_ARCHIVE, Integer(PChar('c:\windows\system32\*.dll')));


  • 0

#20 alquimista

alquimista

    Member

  • Miembros
  • PipPip
  • 15 mensajes

Escrito 07 julio 2009 - 04:45

En delphiarea.com hay un componente gratuito FindFile que es una pasada..
Trabaja con filtros de todo tipo y se puede utilizar en multitarea...
  • 0