Baixar todos os diretorios e arquivos no ftp
Bom dia pessoal!
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
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
Curtidas 0
Respostas
Massuda
21/11/2006
Acho que você está usando o TIdFTP, nesse caso, dê uma olhada [url=http://forum.clubedelphi.net/viewtopic.php?t=67067]neste tópico[/url] sobre como obter a lista de arquivos/pastas em um servidor FTP.
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.
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.
GOSTEI 0
Eric.miranda
21/11/2006
Obrigado Massuda pela dica.
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?
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?
GOSTEI 0
Massuda
21/11/2006
Uma dúvida..teria que criar indices dinamicamente? Pois para navegar entre os registros eu sempre usei indice..
Sinceramente, não sei o que você quer dizer com ´indices´. Normalmente, seja para acessar arquivos num servidor FTP como para manipular arquivos no HD da sua máquina, usa-se algo parecido com o que é mostrado [url=http://forum.clubedelphi.net/viewtopic.php?t=64000]nesse tópico[/url] (o exemplo lista os arquivos num HD).Mas se quiser continuar com ´indices´, explique melhor a idéia.
GOSTEI 0
Eric.miranda
21/11/2006
Olá Massuda..valeu pela dica..
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
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
GOSTEI 0
Eric.miranda
21/11/2006
Aí pessoal..depois de quebrar a cabeça aqui e com a ajuda de vcs consegui finalmente o que queria.. este código abaixo puxa todos os arquivos,diretórios e subdiretórios existentes no ftp..
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!!
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.
GOSTEI 0
Eric.miranda
21/11/2006
Aí pessoal..depois de quebrar a cabeça aqui e com a ajuda de vcs consegui finalmente o que queria.. este código abaixo puxa todos os arquivos,diretórios e subdiretórios existentes no ftp..
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!!
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.
GOSTEI 0