IdFTP i przepisanie do tablicy

0

Cześć,

Chcę pobrać wszystkie pliki z jednego katalogu serwera i zapisać ich nazwy i właściwości do tablicy.
Nie mam koncepcji jak to zrobić. Próbowałem przez IdFTP1.List(bufor), '', True) ale to droga przez mękę.
Jak to można sensownie zrobić?

Pozdrawiam.

0
Markoni napisał(a):

ale to droga przez mękę.

znaczy co??

0

Też właśnie nie wiem co to za "męka" :)
Robisz sobie pętlę po plikach danego katalogu ftp , pobierasz każdy i zapisujesz nazwę do tablicy ...

0

W jaki sposób pobrać z takiego strumienia nazwę pliku, który jest po siódmym średniku?

po funkcji: IdFTP1.List(Lista, '', True)

0

zerknij na funkcję Split

0

Z tym Split-em to nie jest tak prosto. Gdy w katalogu jest dużo plików to w Splicie musiałbym odbierać wielokrotność siódmego średnika.
Ponieważ gdy robię Split siódmego średnika to w pętli ciągle mam pokazany tylko pierwszy plik (oczywiście Split robię przed pętlą).

0

@Markoni:

Markoni napisał(a):

Z tym Split-em to nie jest tak prosto. Gdy w katalogu jest dużo plików to w Splicie musiałbym odbierać wielokrotność siódmego średnika.

Ponieważ gdy robię Split siódmego średnika to w pętli ciągle mam pokazany tylko pierwszy plik (oczywiście Split robię przed pętlą).

ale troszkę się ze mnie nabijasz?
robisz rozbicie łańcucha przed pętlą a później oczekujesz że otrzymasz wynik z pętli?

w skrócie mniej więcej jak to powinno być:

  • ustawiasz się na odpowiednim folderze na ftp,
  • puszczasz pętle po elementach w tym folderze o ilości iteracji takiej jak ilość elementów w tym folderze,
  • w pętli pobierasz dane pliku i przechowujesz w jakimś TStringList lub podobnym zasobniku,
  • rozbijasz te dane za pomocą funkcji split zapisując wynik do następnego zasobnika, np. tablicy,
  • kończysz pętlę.

Oczywiście są sprawy o których trzeba pomyśleć:

  • zabezpieczenie przed wskazaniem folderu nieistniejącego,
  • co zrobić z folderami w folderze nadrzędnym:
    • pomijać,
    • wchodzić do środka i liczyć dalej?
  • co zrobić po problemach z połączeniem (to jest zasób zdalny i zawsze coś może się zdarzyć) - to wszystko trzeba przewidzieć.

Najlepiej rozrysuj to sobie w formie graficznej a później oprogramuj poszczególne elementy. To zawsze działa.

0

Masz rację, chciałem napisać że przed pętlą robię IdFTP1.List(Lista, '', True).
W "Lista" mam wtedy wszystkie pliki z danymi o nich, rozdzielone bajtami 0D 0A.
Już rozumiem. Próbuję rozdzielić w pętli, ale ciągle mam pokazany (w każdej linijce) tylko pierwszy plik.

Po prostu nie wiem jak przesuwać w 'Lista' ofset aby Splitować następną linijkę. Jak to się robi?

0

Fragment:

               IdFTP1.List(Lista, '', True);

               for i := 1 to Lista.Count do
               begin
                   Splitted := Lista.Text.Split([';'], 8);
                   Memo1.Lines.Add(IntToStr(i)+'> '+Splitted[7]);
               end;

gdzie, Lista: TStrings.
I tu trzeba rozdzielić długi string "Lista" z kolejnymi danymi plików. W powyższej pętli oczywiście pokazany jest tylko pierwszy plik z Lista.

0

Jeszcze tak możesz spróbować:

      IdFTP.List;
      For I := 0 to IdFTP.DirectoryListing.Count-1 do
      Begin
        If IdFTP.DirectoryListing[I].ItemType = ditFile then
        begin
           Memo1.Lines.Add(IdFTP.DirectoryListing[I].FileName);
        end;
      End;
0

W wersji IdFTP którą posiadam nie ma DirectoryListing. Czy można to inaczej zapisać?

0
Svenson napisał(a):

Jeszcze tak możesz spróbować:

      IdFTP.List;
      For I := 0 to IdFTP.DirectoryListing.Count-1 do
      Begin
        If IdFTP.DirectoryListing[I].ItemType = ditFile then
        begin
           Memo1.Lines.Add(IdFTP.DirectoryListing[I].FileName);
        end;
      End;

Jak zinterpretować działanie powyższej pętli?

0
// wylistuj zawartość bieżącego katalogu
IdFTP.List();

// przeiteruj po każdym znalezionym obiekcie
for I := 0 to IdFTP.DirectoryListing.Count - 1 do
begin
  // sprawdź, czy obiekt jest plikiem i jeśli tak
  if IdFTP.DirectoryListing[I].ItemType = ditFile then
  begin
     // dodaj jego nazwę do kontrolki
     Memo1.Lines.Add(IdFTP.DirectoryListing[I].FileName);
  end;
end;
0

W której wersji Indy występuje IdFTP.DirectoryListing?
Ja mam Indy10.

0

Chyba każdej 10.x w 10.6.2.0 i 10.6.2.5366 jest na pewno.

0

W katalogu "\Embarcadero\Studio\20.0\source" mam podkatalogi: indy i Indy10. Gdy przeszukuję w podkatalogu Indy10 to znajduje pliki z DirectoryListing:
IdFSP.pas
IdFTP.pas
IdFTPBaseFileSystem.pas
IdFTPServer.pas

Czy trzeba coś dodać aby nie pojawiał się błąd: 'IdFTP' does not contain a member named 'DirectoryListing' gdy powyższe pliki istnieją?

0

Czy to co opisałem o plikach w poprzednim poście jest normalne?

0

Nie chce mi się odpalać środowiska a nie pamiętam co trzeba zrobić (skoro normalnie tego nie widzi). Na moje oko patrząc w stary projekt używający tej właściwości to jeżeli do tego wymaga czegoś dodatkowo w uses może to być IdFTPList i/lub IdAllFTPListParsers.

0

IdFTPList był, nie było IdAllFTPListParsers., ale po dodaniu dalej jest ten problem:

Unit1.pas(176): E2003 Undeclared identifier: 'DirectoryListing'

Zupełnie nie wiem jak to ugryźć, chyba się poddam... Nigdzie nie mogę znaleźć pomocy w tym problemie.

0

Spróbuj jeszcze kliknąć w obiekt IdFTP w tej instrukcji przytrzymując klawisz Ctrl. Powinien otworzyć plik, w którym zdefiniowana jest klasa TIdFTP (TIdFTP = class(TIdExplicitTLSClient)) i tam sprawdź czy występuje DirectoryListing
Wygląda na to, że korzysta z nieodpowiednich referencji.

0

Niby coś jest, ale całość nie działa.

W załączniku plik: IdFTP.pas

1

Hmm, podejrzewam że nie za dokładnie usunąłeś Indy 9 z Delphi (podejrzewam że takie miałeś skoro pisałeś że masz folder Indy i Indy10) i z tego powodu Delphi jakimś cudem odwołuje się do IdFTP.doc (w pliku źródłowym IdFTP.pas jest OK) od indy 9 który jakimś cudem tam pozostał. Radzę usunąć Indy i zainstalować na nowo... albo do tego nawet tylko sam IdFTP.doc i koniecznie sprawdzić w ustawieniach (nie pamietam dokładnie) coś chyba w Library path czy nie ma ścieżek odnoszących się do starej wersji Indy (jeżeli są to usunąć) i czy koniecznie są wszystkie do nowej.

0

Nie znalazłem w katalogu Embarcadero pliku IdFTP.doc.
Z chęcią bym zainstalował ponownie Indy10, ale nie działa oficjalna strona. Gdzie można pobrać ten dodatek?

0

Skąd wziąłeś plik IdFTP.pas? Pewnie z folderu Indy10 w którym pewnie masz wszystkie pliki potrzebne do instalacji. Ale łap https://github.com/IndySockets/Indy tylko nie wiem czy coś z tego będzie jak raczej nie potrafisz pozbyć się pozostałości.

0

Którą wersję z tej paczki trzeba zainstalować do Delphi 10.3?

PS: Gdybym chciał jeszcze nie instalować powyższego, to w którym miejscu są ustawienia do sprawdzenia ścieżek dla np. IdFTP?

1

Tools->Options->Enviroment Options->Delphi Options->Library
U mnie w Browsing path mam coś takiego:

$(BDS)\source\Indy10\Core
$(BDS)\source\Indy10\System
$(BDS)\source\Indy10\Protocols
0

W mojej wersji Delphi jest to w innym miejscu, ale są te same wpisy (też tylko z \Indy10)

Z tego linku githuba którą wersję zainstalować pod Delphi 10.3?
Są tylko do wersji: 5, 6, 7 i 2005, 2006, 2007, 2009

Jak w 100% pozbyć się, przed instalacją nowego, śmieci z jakichkolwiek resztek Indy i Indy10?

0

Są przecież pakiety do Rio to te z 260 na końcu nazwy.
Jak się pozbyć starej wersji? Przede wszystkim odinstalować obecnie zainstalowaną wersję Component->Install Packages po kolei zaznaczać Indy 10 (powinno być 2 pozycje) i Remove a później na piechotę poszukać plików Id.dcu, Indy.dcu, dclIndy*.dcu oraz plików *.bpl oczywiście tylko tych nazwach takich nazwy pakietów *.dpk tych co się kompiluje i instaluje podczas instalacji Indy. Pliki oczywiście usuwa się przed instalacją.

0

Zupełnie nie pamiętam żebym instalował Indy10 w Delphi. Czy jest on dostarczany razem z Delphi10.3?

0

Z 10.3 na pewno jest Indy 10 nie pamiętam dokładnie numeru wersji ale Indy 10 na bank. Tylko nie wiem co w takim razie porobiłeś że nie widzu tej właściwości na wszelki wypadek przeinstaluj, bo inaczej dlaczego nie widzi pozostaje sprawą nie do ogarnięcia a od czegoś przecież trzeba zacząć i dążyć do celu eliminując nawet potencjalne przyczyny błędu.

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