Synapse i pobieranie nazw plików z katalogów - sposoby?

0

Witam, chciałbym się dowiedzieć czy istnieje jakiś szybszy lub lepszy sposób na pobranie tylko nazw plików z serwera ftp (gdzie pliki są w różnych katalogach) przy wykorzystaniu Synapse

Ja realizuję to tak:

-> katalog główny pobieram listę podkatalogów
-> otwieram każdy podkatalog i sprawdzam jakie są w nim pliki i tak każdy katalog.

0

Poniżej procedura z wykorzystaniem Indy - czas pobierania katalogów 3 sekundy;

function TDownload.GetLista: Integer;
var
  Temp : TStringList;
begin
  ListaPlikow.Clear;
  Temp := TStringList.Create;
  Try
    idftp.List(Temp,DirTowary+'*.jpg',False);
    idftp.List(ListaPlikow,DirTowary+'*.JPG',False);
    ListaPlikow.AddStrings(Temp);
  Finally
    Temp.Free;
  End;
  vMax := ListaPlikow.Count;
  Result := vMax;
end;

Teraz procedura z wykorzystaniem Synapse - czas pobierania ok 3 minut

procedure TForm1.GetFileList;
var
  x,y: integer;
  FtpList : TFTPList;
begin
  FTP.List('',false);
  FtpList := TFTPList.Create;
  FtpList.Assign(FTP.FtpList);
  for x := 0 to FtpList.Count-1 do
    if FtpList.Items[x].Directory then
    begin
      FTP.List(FtpList.Items[x].FileName,false);
      for y := 0 to FTP.FtpList.Count-1 do
        if LowerCase(ExtractFileExt(FTP.FtpList.Items[y].FileName)) = '.jpg' then
        begin
          sListBox1.Items.Add(FTP.FtpList.Items[y].FileName);
          {...}       
        end;
    end;  
  FTPList.Free;
end;

Próbowałem z FTP.List(FtpList.Items[x].FileName,true); jednak to nic nie przyspiesza. Proszę o jakieś cenne wskazówki.

0

Przede wszystkim te sposoby co widzę mimo iż różne pakiety, różnią się wykonaniem, dlatego może stąd ta różnica. Wieki nie bawiłem się modułem ftpsend. A kiedy pisałem bardzo prosty klient FTP, tylko z możliwością chodzenia po katalogach i przeglądania ich zawartości to nie potrzebowałem tej funkcjonalności co Ty, poza tym testowałem głownie lokalnie na postawionym pod kontrolą Serv-U serwerze FTP. Ale zaraz pokombinuje, jak do czegoś dojdę to wkleje tutaj przykłądowy kod albo dołacze całość. Chociaż wolał bym nie robić nic z tego, bo dojdzie 90585255158 kolejnych pytan. Wedlug mnie powinno się kombinować regurencyjnie, tak jak przy wyszukiwaniu plików funkcjami WinAPI wraz z podkatalogami.

EDIT: ok, mam nadzieję, że nie będę tego żałował. Dołaczone archiwum zawiera: kod, exeka oraz wszystkie potrzebne moduły do skompilowania. Kod działa. Dla 1602 plików na FTPie lokalnym w kilkunastu podkatalogów, skanowane oczywiście od głownego katalogu FTP'a, zajmuje to maksymalnie 160 ms. Dla innego FTP'a, do którego mam dostęp na ftp.host.sk zajmuje to dla 390 plików, ale bardzo dużej ilości podkatalogów od około 16 do lekko ponad 19 sekund. Także myślę, że jest ok.

I zrobiłem, to tak jak opisałem. Ponieważ Ty to zrobiłeś wedlug mnie w obu przypadkach w stylu "z czterech liter" niestety. Takie rzeczy jak wyszukiwanie plików na dysku, nieważne czy lokalnym czy zdalnym najczęściej dokonuje się właśnie przez rekurencję. Mam nadzieję, że kod się przyda. Rób z nim co chcesz, tylko daj znać o autorze oryginału :) A i na przyszłośc kombinuj trochę zanim zapytasz na forum. Fajnie, że ostatnio pomogłeś jednej dziewczynie z problemem z WebAPI Allegro. Plus ode mnie za to. Ale zauważyłem również, że nie radzisz sobie ostatnio z często dosyć banalnym problemami, z którymi za pewne poradził byś sobie sam gdybyś tylko chwilę cierpliwie nad nimi pomyślał. Wiadomo, na forum pomagamy, ale trzeba strać się pomóc sobie samemu :)

Aha, ten kod if Pos('n*', RC.Mask) <> 1 jest użyty nie bez powodu. Otóż z moich testów na lokalnym serwerze pod Serv-U zawuażyłem, że potrafi on dodawać jako wpis taki kwiatek, który nie jest ani plikiem, ani katalogiem. Po prostu na listę trafia coś co nie powinno. Nie winię za to ani Synapse, ani Serv-U, bo pod Total Commanderem czy WinSCP jest wszystko ok. Tak samo jak z użyciem ftpsend na unixowych serwerach też jest ok. A i wyszukiwanie po rozszerzeniu - jeżeli potrzebujesz - to już zrób sobie samodzielnie, oczywiście jako parametr dla procedury wyszukującej. I sorry za nieskładny post, ale późna pora. Pisałem na szybko, no i znowu się rozpisałem - niestety ;P

0

Olesio Dzięki za taki sposób rozwiązania, czegoś nowego się nauczyłem. Ale :)

Sposób który ty przedstawiłeś zajmuje 116 sekund (ok 700 katalogów i 2400 plików )

Procedura która zamieszczam pod spodem wykonuje to w 2-3 sekundy.

procedure GetFileList;
var
  idFTP : TidFTP;
  lp : TStringList;
begin
  lp := TStringList.Create;
  idFtp := TIdFtp.Create(Nil);
  idFTP.Username := '***';
  idFTP.Password := '***';
  idFTP.Host := 'ftp.***.nazwa.pl';
  IdFTP.Connect;
  idftp.List(lp,'*/*.*',False);
  lp.SaveToFile('c:\FileList.txt');
  lp.Free;
  idFTP.Free;
  showMessage('Wykonano');
end;

Zastanawia mnie tak kolosalna różnica między indy a synapse. Zabieram się do studiowania kodu od indy muszę znaleźć rozwiązanie aby synapse było takie szybkie. Bo indy zbyt często zrywa połączenia abym chciał je wykorzystać.

0

Znalazłem rozwiązanie tego problemu: Aby pobrać list wszystkich plików w podkatalogach (1-go rzędu) należy użyć takiego odwołania do podkatalogów:

FTP.List('/.*',false); Wyszukiwanie trwa jak w przypadku indy kilka sekund

0

No ok. Fajnie, że sobie poradziłeś. Mi się wydaję, że kod który podałem jest raczej prawidłowy. Ale może te List w TFTPSend działa jakoś inaczej. Jak pisałem, na dość wolnym FTP'ie i koncie na host.sk, trwało to tyle ile opisałem. Chociaż skoro Indy robi to szybciej i uzyskujesz identyczny rezultat jak w moim kodzie pod Synapse to znaczy, że Indy ma tę obsługę Indy zrobioną lepiej/inaczej, co wpływa na szybkość.

Ja dla próby na tym FTPie, na host.sk, dałem wyszukiwanie Alt+F7 z pod Total Commandera i zmierzyłem czas od startu wyszukiwania do jego końca stoperem w telefonie komórkowym. Rezultat to około 22 sekundy. Wiadomo, że 116 sekund to za długo, ale znowu trzy sekundy na serwerze nie będącym lokalnie albo w sieci lokalnej, nawet przy bardzo szybkim połączeniu internetowym według mnie jest ciężkie do osiągnięcia przy takiej ilości plików i podkatalogów. Ale mogę się mylić.

Co do zrywania połączenia, wątpie w winę Synapse. Chyba, że masz tak specyficzny serwer, że coś jest inaczej obsługiwane.

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