Baixar todos os diretorios e arquivos no ftp
21/11/2006
0
Estou mto perdido usando o ftp..
Preciso baixar um arquivo aqui e não estou conseguindo achar uma saída.
Terei que puxar tudo que está no ftp todos os dias..
com os arquivos tá tranquilo . o problema maior é com as pastas..
por exemplo:
terei a pasta 20061121
dentro dela terei de 2 a 10 pastas.. e tb arquivos soltos.
Não sei como fazer um loop não sabendo qtas pastas terei e difenciando se for arquivo puxar.. se for a pasta terei que entrar na pasta para puxar.. não é isso??
alguém já fez algo parecido??
obrigado
Eric.miranda
Posts
21/11/2006
Massuda
Após logar no servidor, pegue a lista de arquivos/pastas e percorra a lista; se for um arquivo, copie ele, se for uma pasta, mude para a pasta e repita a operação. Esse tipo de processo é geralmente implementado em uma procedure recursiva.
21/11/2006
Eric.miranda
Uma dúvida..teria que criar indices dinamicamente?
Pois para navegar entre os registros eu sempre usei indice.. e como não sei a qtdade de pastas que irei ter ..acho que teria que criar esses indices dinamicamente.. certo?
21/11/2006
Massuda
Mas se quiser continuar com ´indices´, explique melhor a idéia.
22/11/2006
Eric.miranda
vou dar uma estudada nesse tópico para ver o que posso adaptar aqui..
O que queria dizer com o indice seria caso o exemplo
IdFTP1.DirectoryListing.Items[indice].FileName;
no qual eu percorreria o directorylisting sem usar um directorylistbox..
valew
27/11/2006
Eric.miranda
Não sei se é a maneira certa ou elegante..mas o que importa é que funciona!!
Obrigado a todos pela ajuda e vai aí o código para quem precisar!!
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, IdBaseComponent, IdComponent,IdTCPConnection, IdTCPClient, IdFTP, ComCtrls,IdIntercept,IdAntiFreezeBase, IdAntiFreeze, IdLogBase, IdLogDebug, IdGlobal, IdLogEvent, IdFTPCommon, IdFTPList, Gauges, Menus, Buttons; type TForm1 = class(TForm) btnConectar: TSpeedButton; GroupBox2: TGroupBox; ListDiretorios: TListBox; btnListar: TButton; IdFTP1: TIdFTP; procedure btnConectarClick(Sender: TObject); procedure FormActivate(Sender: TObject); procedure btnListarClick(Sender: TObject); procedure ListarDir; procedure Listar(dir : string); private { Private declarations } public { Public declarations } end; var Form1: TForm1; i : integer; NomePastaBase,PastaBase,Diretorio: String; Valores : TStrings; implementation {$R *.dfm} procedure TForm1.ListarDir; begin i := 0; IdFTP1.List(nil); while i < IdFTP1.DirectoryListing.Count do begin if IdFTP1.DirectoryListing.Items[i].ItemType <> ditDirectory then IdFTP1.Get(IdFTP1.DirectoryListing.Items[i].FileName, ´C:/Eric/Teste/´+IdFTP1.DirectoryListing.Items[i].FileName, true) else begin NomePastaBase:= copy(IdFTP1.RetrieveCurrentDir,length(PastaBase)+1,length(IdFTP1.RetrieveCurrentDir)); ListDiretorios.Items.Add(NomePastaBase+´/´+IdFTP1.DirectoryListing.Items[i].FileName); if not DirectoryExists(´C:/Eric/Teste/´+IdFTP1.DirectoryListing.Items[i].FileName) then ForceDirectories(´C:/Eric/Teste/´+IdFTP1.DirectoryListing.Items[i].FileName) end; i := i+1; end; while ListDiretorios.Items.Count - 1 >= 0 do begin IdFTP1.ChangeDir(PastaBase+ListDiretorios.Items[0]); Diretorio := ListDiretorios.Items[0]+´/´; ListDiretorios.Items.Delete(0); listar(Diretorio); end; end; procedure TForm1.Listar(dir : string); begin i := 0; IdFTP1.List(nil); while i < IdFTP1.DirectoryListing.Count do begin if IdFTP1.DirectoryListing.Items[i].ItemType <> ditDirectory then begin IdFTP1.Get(IdFTP1.DirectoryListing.Items[i].FileName, ´C:/Eric/Teste/´+dir+IdFTP1.DirectoryListing.Items[i].FileName, true); end else begin NomePastaBase:= copy(IdFTP1.RetrieveCurrentDir,length(PastaBase)+1,length(IdFTP1.RetrieveCurrentDir)); ListDiretorios.Items.Add(NomePastaBase+´/´+IdFTP1.DirectoryListing.Items[i].FileName); if not DirectoryExists(´C:/Eric/Teste/´+dir+IdFTP1.DirectoryListing.Items[i].FileName) then ForceDirectories(´C:/Eric/Teste/´+dir+IdFTP1.DirectoryListing.Items[i].FileName) end; i := i+1; end; end; procedure TForm1.btnConectarClick(Sender: TObject); begin IdFTP1.Connect(); PastaBase := IdFTP1.RetrieveCurrentDir; btnListar.Enabled := true; btnConectar.Enabled := false; end; procedure TForm1.FormActivate(Sender: TObject); begin IdFTP1.Host := ´ftp.eric.com.br´; end; procedure TForm1.btnListarClick(Sender: TObject); begin ListarDir(); Showmessage(´fim´); end; end.
27/11/2006
Eric.miranda
Não sei se é a maneira certa ou elegante..mas o que importa é que funciona!!
Obrigado a todos pela ajuda e vai aí o código para quem precisar!!
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, IdBaseComponent, IdComponent,IdTCPConnection, IdTCPClient, IdFTP, ComCtrls,IdIntercept,IdAntiFreezeBase, IdAntiFreeze, IdLogBase, IdLogDebug, IdGlobal, IdLogEvent, IdFTPCommon, IdFTPList, Gauges, Menus, Buttons; type TForm1 = class(TForm) btnConectar: TSpeedButton; GroupBox2: TGroupBox; ListDiretorios: TListBox; btnListar: TButton; IdFTP1: TIdFTP; procedure btnConectarClick(Sender: TObject); procedure FormActivate(Sender: TObject); procedure btnListarClick(Sender: TObject); procedure ListarDir; procedure Listar(dir : string); private { Private declarations } public { Public declarations } end; var Form1: TForm1; i : integer; NomePastaBase,PastaBase,Diretorio: String; Valores : TStrings; implementation {$R *.dfm} procedure TForm1.ListarDir; begin i := 0; IdFTP1.List(nil); while i < IdFTP1.DirectoryListing.Count do begin if IdFTP1.DirectoryListing.Items[i].ItemType <> ditDirectory then IdFTP1.Get(IdFTP1.DirectoryListing.Items[i].FileName, ´C:/Eric/Teste/´+IdFTP1.DirectoryListing.Items[i].FileName, true) else begin NomePastaBase:= copy(IdFTP1.RetrieveCurrentDir,length(PastaBase)+1,length(IdFTP1.RetrieveCurrentDir)); ListDiretorios.Items.Add(NomePastaBase+´/´+IdFTP1.DirectoryListing.Items[i].FileName); if not DirectoryExists(´C:/Eric/Teste/´+IdFTP1.DirectoryListing.Items[i].FileName) then ForceDirectories(´C:/Eric/Teste/´+IdFTP1.DirectoryListing.Items[i].FileName) end; i := i+1; end; while ListDiretorios.Items.Count - 1 >= 0 do begin IdFTP1.ChangeDir(PastaBase+ListDiretorios.Items[0]); Diretorio := ListDiretorios.Items[0]+´/´; ListDiretorios.Items.Delete(0); listar(Diretorio); end; end; procedure TForm1.Listar(dir : string); begin i := 0; IdFTP1.List(nil); while i < IdFTP1.DirectoryListing.Count do begin if IdFTP1.DirectoryListing.Items[i].ItemType <> ditDirectory then begin IdFTP1.Get(IdFTP1.DirectoryListing.Items[i].FileName, ´C:/Eric/Teste/´+dir+IdFTP1.DirectoryListing.Items[i].FileName, true); end else begin NomePastaBase:= copy(IdFTP1.RetrieveCurrentDir,length(PastaBase)+1,length(IdFTP1.RetrieveCurrentDir)); ListDiretorios.Items.Add(NomePastaBase+´/´+IdFTP1.DirectoryListing.Items[i].FileName); if not DirectoryExists(´C:/Eric/Teste/´+dir+IdFTP1.DirectoryListing.Items[i].FileName) then ForceDirectories(´C:/Eric/Teste/´+dir+IdFTP1.DirectoryListing.Items[i].FileName) end; i := i+1; end; end; procedure TForm1.btnConectarClick(Sender: TObject); begin IdFTP1.Connect(); PastaBase := IdFTP1.RetrieveCurrentDir; btnListar.Enabled := true; btnConectar.Enabled := false; end; procedure TForm1.FormActivate(Sender: TObject); begin IdFTP1.Host := ´ftp.eric.com.br´; end; procedure TForm1.btnListarClick(Sender: TObject); begin ListarDir(); Showmessage(´fim´); end; end.
Clique aqui para fazer login e interagir na Comunidade :)