[DELPHI] Pobieranie pliku i odczyt wszystkich danych

0

Witam.
Jak zapewne wiecie w życiu każdego człowieka następuje taka chwila, że zaczyna on odczuwać potrzebę napisania w delphi, programu do pobierania plików z internetu... ;]

A tak na serio - samo pobieranie to jedna z łatwiejszych rzeczy, problem polega na tym że nie wiem jak odczytać dane, niezbędne do komfortowego pobierania (wielkość pliku, postęp w pobieraniu, szybkość transferu itd).

Na początek starałem się zmajstrować coś w oparciu o bibliotekę UrlMon. UrlDownloadToFile jest niezłe (ze względu na prostotę), ale ma też sporo wad. Miewa konflikty z Internet Explorerem, blokuje możliwość używania timera i podobnych komponentów (odpalają się one dopiero PO pobraniu pliku), no i nie pobiera pliku skokowo (w pakietach), działa raczej jak torrenty - tworzy opakowanie (o odpowiedniej wielkości) a potem je wypełnia...

Jego budowa wygląda tak:
UrlDownloadToFile(Caller: IInterface, URL: PChar, FileName: PChar, Reserved: Cardinal, StatusCB: IBindStatusCallBack);

Czytałem że w tym "StatusCB: IBindStatusCallBack" znajdują się jakieś informacje na temat pobierania, ale nie mam koncepcji jak to odczytać...

Potem było Indy (wtyczka idHttp - funkcja Get). Pobieranie również jest bardzo proste, ale wady są zbliżone jak u powyższego - co utrudnia użytkowanie. Dodatkowo zdarzenia onWork i onWorkBegin zdają się nie działać poprawnie (kod w nich zawarty wykonuje się dopiero PO pobraniu pliku...).

Na koniec posłużyłem się komponentem HttpGet i (początkowo) sukces był, i to spektakularny. Niestety komponent ten również nie zadawala mnie do końca. Można odczytać wielkość pliku i postęp w pobieraniu, ale brakuje szybkości transferu, czy czasu potrzebnego na pobranie. Oczywiście te dane można wyliczyć dysponując pozostałymi, ale niestety wychodzi to dość koślawo (bo trzeba się posłużyć timerem i wszystko staje się jakby mniej dokładne, transfer dziwnie szaleje, co przy pobieraniu z IE się nie dzieje. Podobnie jest z czasem do końca pobierania, mam powiedźmy 1 min i 20 sec, a za sekundę robi się 20 sec, by za chwilę znów podskoczyć i zmienić się w 5 minut...).

Moje pytanie jest więc takie: Co możecie mi polecić do napisania prostego programiku w delphi, który będzie pobierał pliki i monitorował tych kilka wartości???

PS. Kombinowałem też coś z bibliteką WinInet, ale jest ona dosyć skomplikowana (chyba za bardzo jak dla mnie :P).

PS2. Wiem że to pytanie padało już nie raz (przeszukałem około 35 stron na forum), ale jakoś nigdy nie została udzielona satysfakcjonująca odpowiedź... Był jeden link do kodu źródłowego (który wyglądał na dobry), ale z komentarzami po niemiecku... A ja nie szprecham więc niezbyt wiele zrozumiałem.

Pozdro!

0

Taki wierszyk wymyśliłem naprędce:
Ja, MisiekD oraz wielu innych Ci to powie
Użyj Synapse, Indy przy nim łąduje w rowie.

A tak poważnie to polecam oczywiście Synapse.
Są przykłady, jest dokumentacja. Można pokazać postęp i inne, bo ma zdarzenia.
Małym minusem jest tylko to, że plik zapisywany będzie w TMemoryStream, więc
nie da się go zapisywać przyrostowo jak robią to przeglądarki internetowe, no ale
coś za coś. Na plus masz za to łatwość użycia oraz szybkość - czego nie mozna o
modułach i komponentach korzystających z internet explorera, raczej powiedzieć.
Co do zapisywania pliku to ystarczy utworzyć TFileStream, a po pobraniu zrobić:

//...
  if Assigned(DLStream) = True then
  begin
    DLStream.CopyFrom(SynDL.Document, SynDL.Document.Size);
    DLStream.Free;
  end;
0

Rozwiązanie na ProgressBar do funkcji UrlDownloadToFile z interfejsem IBindStatusCallBack znajduje się tutaj:

IBindStatusCallBack - Jak uzyskać ProgessBar do funkcji UrlDownloadToFile

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