Baixar todos os diretorios e arquivos no ftp

21/11/2006

0

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


Eric.miranda

Eric.miranda

Responder

Posts

21/11/2006

Massuda

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.


Responder

21/11/2006

Eric.miranda

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?


Responder

21/11/2006

Massuda

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.


Responder

22/11/2006

Eric.miranda

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


Responder

27/11/2006

Eric.miranda

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!!

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.




Responder

27/11/2006

Eric.miranda

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!!

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.




Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar