FTP i ChangeDir

0

Witam,
Mam następującą strukturę na serwerze (dla testów założony):

SERWER:
-katalog
 --t1
 --t2
 --test2
-plik.gif
-plik2.gif

Domyślnie łącząc się daje takie parametry:

IdFTP1.user := text_login.Text;
IdFTP1.Password := text_haslo.Text;
IdFTP1.Host := text_serwer.Text;
IdFTP1.Connect();
IdFTP1.ChangeDir('.\');

Następnie dynamicznie odczytuje z ListView przejście do katalog czyli kod wygląda tak:

IdFTP1.ChangeDir('.\katalog\');

W TotalCommander wyświetla taką ścieżkę: 0:/katalog/.

Wszystko jest ok ale jak dalej się pogłębię, to znaczy z katalog pójdę do podrzędnego to wywala error a ścieżka wygląda tak:

IdFTP1.ChangeDir('.\katalog\test2\');

W TotalCommander wyświetla taką ścieżkę: 0:/katalog/test2/.

Dlaczego tak się dzieje?
Czy między wykonaniem kolejnej zmiany katalogu trzeba coś dodatkowo zrobić?

0

W Synapse się to trochę inaczej robi i nieco łatwiej, bo jest osobny typ, który zawsze przechowuje listę plików
lub katalogów z atrybutami, rozmiarami, prawami i takimi tam, ale katalogi też trzeba sprawdzać czy mają w
prawach d, bo inaczej Synapse zwraca jako katalogi pliki zawierające kropki jako pierwszy znak czyli ukryte w
Linuxach, spróbuj poniższy kod. Wprawdzie używam tutaj tylko ListBoxa i pokazuje same katalogi plus dwa na
górze ListBoxa Itemy o nazwie '<.>' służący do przejścia do głownego katalogu i '<..>' do nadrzędnego, lecz
powinieneś pojąć ideę i dopasować sobie kod do swoich potrzeb. Dodam, że ListBox jest ns GroupBox, którego
Caption zmienia się na nazwę aktualnego katalogu. Chwilę musiałem pokobminować z tym kodem, bo jakoś w
innym programie używałem Synapse, ale tam zrobiem nieco inaczej, ale waże, że jak testowałem - działa ok.
A poprzedni kod z Synapse nie zostawiłęm sobie, bo osoba dla której pisałem program nie potrzebowała już w
jednej z opcji wyświetlania katalogu dlatego usunąłem ten kod, ale z tego co kojarze był na podobnej zasadzie.

  public
    SL : TStringList;
    procedure ZmienKatalog(Katalog : string);
  end;

var
  MainForm : TMainForm;

const
  GlownyKat = '<.>';
  WyzejKat = '<..>';

implementation

{$R *.dfm}

procedure TMainForm.FormCreate(Sender : TObject);
begin
  SL := TStringList.Create;
end;

procedure TMainForm.ZmienKatalog(Katalog : string);
var
  I : Word;
  S, Nazwa : string;
begin
  ListBox1.Clear;
  if Katalog = GlownyKat then
  begin
    IdFtp1.ChangeDir('/');
    Katalog := '';
  end
  else
    if Katalog = WyzejKat then
    begin
      IdFtp1.ChangeDirUp;
      Katalog := ''; ;
    end;
  IdFtp1.ChangeDir(IdFtp1.RetrieveCurrentDir + '/' + Katalog);
  if IdFtp1.RetrieveCurrentDir <> '/' then
  begin
    ListBox1.Items.Add(GlownyKat);
    ListBox1.Items.Add(WyzejKat);
  end;
  IdFtp1.List(SL, '', True);
  for I := 0 to IdFtp1.DirectoryListing.Count - 1 do
  begin
    S := IdFtp1.DirectoryListing[I].Text;
    Nazwa := IdFtp1.DirectoryListing[I].FileName;
    if (Pos('d', S) = 1) and (Nazwa <> '.') and (Nazwa <> '..') then
    begin
      ListBox1.Items.Add(Nazwa);
    end;
  end;
  GroupBox1.Caption := IdFtp1.RetrieveCurrentDir;
end;

procedure TMainForm.Button1Click(Sender : TObject);
begin
  IdFtp1.Host := 'host.net';
  IdFtp1.Port := 21;
  IdFtp1.Username := 'user';
  IdFTp1.Password := 'pass';
  IdFtp1.Passive := True;
  IdFtp1.Connect;
  if IdFtp1.Connected = True then
  begin
    ZmienKatalog(IdFtp1.RetrieveCurrentDir);
  end
  else
  begin
    ShowMessage('Nie można połączyć z: ' + IdFtp1.Host +'!');
  end;
end;

procedure TMainForm.ListBox1DblClick(Sender : TObject);
begin
  if ListBox1.ItemIndex > -1 then
  begin
    ZmienKatalog(ListBox1.Items[ListBox1.ItemIndex]);
  end;
end;
0

Olesio, bardzo dziękuje za wskazówki i kod, który trochę zdewastowałem ale rozwikłał mój problem :) [browar]
Pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1