diferenças entre arquivo e diretorio via ftp

Delphi

22/08/2005

Colegas, por favor, não consegui entender uma coisa:
estou usando o idFtp do indy clients para criar diretorios no meu server ftp e fazer upload de arquivos. Porém, quando eu dou um ´list´ no idftp e ele retorna um tstringlist com os nomes dos arquivos, como eu faço pra diferenciar o que é arquivo e o que é diretório?

Grato!


Vitor Rubio

Vitor Rubio

Curtidas 0

Respostas

Massuda

Massuda

22/08/2005

Você deve estar usando o método TIdFTP.List... nesse caso, você pode especificar para retornar uma lista de todos os arquivos ou de todos os diretorios; conforme o help do TIdFTP, o [b:90a9f48627]segundo[/b:90a9f48627] parâmetro do método List...[quote:90a9f48627=´Help do Indy´]...is a String value that contains a mask indicating the files and/or directories to be included in the listing. ASpecifier can contain common wildcard characters like ´*´ and ´?´. Some useful masks include:[list:90a9f48627][*:90a9f48627]*.* - All files in the current directory.[*:90a9f48627]* - All directory entries in the current directory.[*:90a9f48627]*. - All files regardless of extension in the current directory.[*:90a9f48627]A??.txt - All text files that have a 3-character name starting with ´A´.[/list:u:90a9f48627][/quote:90a9f48627]...ou seja, você pode dar um List(...,´*´) para obter todos os diretórios e um List(...´*.´) para obter todos os arquivos.


GOSTEI 0
Vitor Rubio

Vitor Rubio

22/08/2005

Também vi isso no help, mas não é bem assim.... Se você usa o ´*´ ele lista todos os arquivos, todos os diretorios e entra nos diretorios, listando também os arquivos e subdiretorios dentro deles.


usando em branco ´´ ele só lista diretorios e arquivos.


GOSTEI 0
Adriano Santos

Adriano Santos

22/08/2005

Tive o mesmo problema.
Fiz um teste aqui e o que obtive foi o mesmo resultado que o victo^_^ relatou, não dá pra saber quem é quem.


GOSTEI 0
Massuda

Massuda

22/08/2005

Desculpe, normalmente eu não uso essa lista informada pelo TIdFTP.List, mas sim uso a lista TIdFTP.DirectoryListing.

No servidor que utilizo, usando ´*.*´ retorna todos os arquivos enquanto ´*´ retorna todos os arquivos mais diretórios.

Fora isso, no início de cada string tem um conjunto de caracteres que indica os atributos (estilo Unix) de cada entrada no diretório...
-rw-rw-r--    1 mickey.mouse ftp         12345 Jan 12  2000 imagem1.jpg
drwxrwxr-x    2 mickey.mouse ftp           512 Jan 12  2000 diretorio1
-rw-rw-r--    1 mickey.mouse ftp         12345 Jan 12  2000 imagem2.jpg
...e todo diretório tem um atributo ´d´ indicado. Mas isso depende muito do tipo de servidor que você estiver usando (no meu caso, é um servidor Linux).

Uma outra forma de fazer isso, que independe do tipo de servidor, é manipular a lista TIdFTP.DirectoryListing...
var
  Lista: TStringList;
  I: Integer;
...
  // passo nil porque não preciso da resposta do servidor
  IdFTP1.List(nil);
  
  for I := 0 to Pred(IdFTP1.DirectoryListing.Count) do begin

    // IdFTP1.DirectoryListing[I].FileName = nome do arquivo/diretório

    if IdFTP1.DirectoryListing[I].ItemType = ditFile then begin
        // é um arquivo
    end
    else if IdFTP1.DirectoryListing[I].ItemType = ditDirectory then begin
        // é um diretório
    end;
    ...
  end;
...
...note que passei nil em TIdFTP.List porque não preciso do texto enviado pelo servidor, mas sim vou usar a lista gerada pelo componente.


GOSTEI 0
Adriano Santos

Adriano Santos

22/08/2005

Firmeza Massuda, consegui usar o esquema que passou. Só fiquei com duas dúvidas (já pensando em montar meu próprio programa ftp, rs).

1 - Como usar só o DirectoryListing?
Vc disse que que uma outra forma seria usando um FOR e tals, fiz de acordo com seu exemplo:

procedure TForm1.Button1Click(Sender: TObject);
var
  I : Integer;
begin
  Application.ProcessMessages;
  with IdFTP1 do
  begin
    Connect;
    List(Nil);
    for I := 0 to Pred(DirectoryListing.Count)-1 do
      if DirectoryListing[I].ItemType = ditFile then
        ListBox1.Items.Add(´Arquivo: ´ + DirectoryListing[I].FileName)
      else if DirectoryListing[I].ItemType = ditDirectory then
        ListBox1.Items.Add(´Diretório: ´ + DirectoryListing[I].FileName);
    Disconnect;
  end;
end;


Mas e qual seria a primeira forma?

2 - Como eu faço para navegar, ou seja, quero abrir a pasta PUB no meu servidor FTP? Direto no idFtp não tem como informar certo?

valeu


GOSTEI 0
Massuda

Massuda

22/08/2005

[quote:be0dbb3cb2=´Adriano Santos´]Mas e qual seria a primeira forma?[/quote:be0dbb3cb2]Desculpe, acho que escrevi de uma forma que dá impressão que tem outra forma de usar o DirectoryListing... eu quis dizer que além de tentar parsear o texto retornado pelo List, outra forma é processar o DirectoryListing.

[quote:be0dbb3cb2=´Adriano Santos´]2 - Como eu faço para navegar, ou seja, quero abrir a pasta PUB no meu servidor FTP? Direto no idFtp não tem como informar certo?[/quote:be0dbb3cb2]Você tem que navegar usando TIdFTP.ChangeDir(...caminho...) e TIdFTP.ChangeDirUp (equivalem a usar ´CD´ e ´CD ..´ no prompt do DOS).


GOSTEI 0
POSTAR