Fórum Baixar todos os diretorios e arquivos no ftp #333391
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
Curtir tópico
+ 0Posts
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.
Gostei + 0
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?
Gostei + 0
21/11/2006
Massuda
Mas se quiser continuar com ´indices´, explique melhor a idéia.
Gostei + 0
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
Gostei + 0
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.
Gostei + 0
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.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)