Jump to content


Photo

¿Cómo identificar un directorio de un archivo con idFTP.GET?


  • Please log in to reply
7 replies to this topic

#1 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14448 posts
  • LocationMéxico

Posted 20 March 2013 - 01:03 PM

Pues eso,

A ver si puedo hacerme entender.

Necesito descargar de un FTP todos los archivos contenidos en un FTP, pero en esa descarga se incluye directorios que no deseo descargar, estoy usando los componentes Indy en específico las funciones



delphi
  1. idFTP.List(Lista, '*.*', false);
  2. idFTP.GET(SourceName, DestName, true);



El problema que se me está presentando es que al intentar descragar un directorio se genera una excepción ya que no puede descargar el directorio, el punto es que yo solo quiero los archivos, los subdirectorios del FTP no los necesito.

La pregunta es, ¿no hay algo como la función findfirst para descartar los directorios y me regrese sólo archivos?

Algo así:



delphi
  1. FindFirst(Archivos, faAnyFile-faDirectory, srRes);



Saludos
  • 0

#2 enecumene

enecumene

    Webmaster

  • Administrador
  • 7419 posts
  • LocationRepública Dominicana

Posted 20 March 2013 - 01:50 PM

¿Por qué no recorres el directorio del FTP y lo vas agregando a un stringlist?, algo como esto:



delphi
  1. for I:= 0 to IdFTP1.DirectoryListing.Count-1 do
  2. begin
  3.   if not DescartarArchivo(idFTP1.DirectoryListing[i].FileName) then
  4.       Lista1.Add(idFTP1.DirectoryListing[i].FileName);
  5. end;



Donde DescartarArchivo() sería donde filtrarías el archivo que no quieres descargar, luego descargas on la lista:



delphi
  1. idFTP1.Get(Lista1,DestName, true);



Algo así pues :p

Saludos.
  • 0

#3 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14448 posts
  • LocationMéxico

Posted 20 March 2013 - 01:54 PM

¿Por qué no recorres el directorio del FTP y lo vas agregando a un stringlist?, algo como esto:



delphi
  1. for I:= 0 to IdFTP1.DirectoryListing.Count-1 do
  2. begin
  3.   if not DescartarArchivo(idFTP1.DirectoryListing[i].FileName) then
  4.       Lista1.Add(idFTP1.DirectoryListing[i].FileName);
  5. end;



Donde DescartarArchivo() sería donde filtrarías el archivo que no quieres descargar, luego descargas on la lista:



delphi
  1. idFTP1.Get(Lista1,DestName, true);



Algo así pues :p

Saludos.


Pues algo similar hago, solo que en la lista que obtengo se "mete" el puto subdirectorio y lo quiere tratar como archivo y pues no es así, necesito saber el atributo del archivo para determinar si es un directorio o es un archivo, ¿ me explico ?

Saludos
  • 0

#4 enecumene

enecumene

    Webmaster

  • Administrador
  • 7419 posts
  • LocationRepública Dominicana

Posted 20 March 2013 - 02:10 PM

Te referirás a los Directorios "." y ".."?
  • 0

#5 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14448 posts
  • LocationMéxico

Posted 20 March 2013 - 03:19 PM

Te referirás a los Directorios "." y ".."?


El arbol es así:

directorio1
directorio2
directorio3
archivo1
archivo2
archivo3
archivo4
::::
archivoN

La función idFTP.list() me regresa la lista de directorios y archivos, lo que yo necesito es sólo obtener la lista de archivos.

Saludos
  • 0

#6 seoane

seoane

    Advanced Member

  • Administrador
  • 1259 posts
  • LocationEspaña

Posted 20 March 2013 - 04:31 PM

Hace tiempo que no trabajo con Indy, pero por aquí tengo algo de código de un proyecto antiguo que puede que te sirva:


delphi
  1. procedure ftpFindFilesRec(RemoteFolder: String; Cliente: TIdFTP;
  2.   Result: TStringList);
  3. var
  4.   i: Integer;
  5.   Str: String;
  6.   Temp: TStringList;
  7. begin
  8.   if (Copy(RemoteFolder,Length(RemoteFolder),1) <> '\') and
  9.     (Copy(RemoteFolder,Length(RemoteFolder),1) <> '/') then
  10.     RemoteFolder:= RemoteFolder + '/';
  11.   Temp:= TStringList.Create;
  12.   try
  13.     Cliente.List(Temp,RemoteFolder,FALSE);
  14.     for i:= 0 to Temp.Count - 1 do
  15.     begin
  16.       Str:= RemoteFolder + Temp[i];
  17.       if Cliente.Size(Str) = -1 then
  18.         ftpFindFilesRec(Str,Cliente,Result)
  19.       else
  20.         Result.Add(Str);
  21.     end;
  22.   finally
  23.     Temp.Free;
  24.   end;
  25. end;
  26.  
  27. procedure ftpFindFiles(RemoteFolder, Server: String; Port: Word;
  28.   Username, Password: String; Result: TStringList);
  29. var
  30.   Cliente: TIdFTP;
  31. begin
  32.   Result.Clear;
  33.   try
  34.     Cliente:= TIdFTP.Create(nil);
  35.     try
  36.  
  37.  
  38.         Cliente.Username:= Username;
  39.         Cliente.Password:= Password;
  40.         Cliente.Passive:= TRUE;
  41.         Cliente.Connect(Server,Port);
  42.         ftpFindFilesRec(RemoteFolder,Cliente,Result);
  43.         Cliente.Disconnect;
  44.     finally
  45.       Cliente.Free;
  46.     end;
  47.   except
  48.     On E: Exception do
  49.       log('Exception: ' + E.Message);
  50.   end;
  51. end;



Básicamente es una búsqueda recursiva en un ftp.

Si te fijas diferencio un directorio de un fichero porque su tamaño es "-1", no se si en las versiones actuales de Indy sigue siendo igual. Pruebalo  ;)

Saludos
  • 0

#7 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14448 posts
  • LocationMéxico

Posted 20 March 2013 - 05:09 PM

Muchas gracias amigo seoane, ya lo pruebo y les comento como quedo el asunto :)

Saludos
  • 0

#8 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14448 posts
  • LocationMéxico

Posted 21 March 2013 - 08:12 AM

Pues si funcionó :) Gracias amigo Seoane, usted siempre con la respuesta correcta. (y)

Saludos
  • 0




IP.Board spam blocked by CleanTalk.