Pobieranie plików z FTP.

0

Znalazłem procedurę do pobierania plików z FTP
np:

 http://www.swissdelphicenter.ch/torry/showcode.php?id=1095 
lub http://www.delphipages.com/forum/archive/index.php/t-208496.html

Plik pobiera się ładnie ale mam problem z pokazaniem progresa.
Otóż podczas pobierania, progres kilkakrotnie zaczyna od początku (ale jeśli pobiera się ten sam plik wielokrotnie ale zawsze w tych samych momentach, przy czym na tym samym pliku u mnie zawsze na 10%, u kolegi na 17%). Ale plik w tym czasie pobiera się dalej.

w tej funkcji jest taki fragment:

 
   if (bufsize > 0) and (bufsize <= READ_BUFFERSIZE) then
      BlockWrite(LocalFile, buffer, bufsize);
    dwBytesRead := dwBytesRead + bufsize;

    { Show Progress }
    ProgressBar.Position := Round(dwBytesRead * 100 / fileSize);

fileSize się nie zmienia, czyli dwBytesRead musi być 0.

Ten kod widziałem na wielu stronach ale nikt nie opisywał takiego problemu. Ktoś wie czemu się tak może dziać?

0

zrobiłem kolejne zapisywanie rozmiaru pobranych danych i mam takie wyniki:

dwBytesRead = 42926080 fileSize = 343556100 ProgressBar.Position = 12
dwBytesRead = 42958848 fileSize = 343556100 ProgressBar.Position = 0

Sprawdźcie wynik działania: Round(dwBytesRead * 100 / fileSize)

Wiecie, dlaczego tak się dzieje?

P.S te zmienne są typu DWORD

0

Ja nie wiem co to za moda. Ktoś kiedyś podając przykład na szybko polecił innym i wszyscy początkujący [?] teraz się chyba upierają na funkcje typu InternetOpen i inne tego typu. Mogę się mylić, ale są chyba one zależne od zainstalowanego IE. Dlaczego nie zrobiśz tego pobierania z FTP'a pod Simple TCP? A jeżeli nie chcesz pokombinować z samodzielną obsluga socketów, to pozostaje Synapse albo indy. Komponent te mają przecież dokumentacje i przykłady. Na pewno będzie mniej problemów, a i obsługia wielu rzeczy w nich jest już zaimplementowana. Postęp też można pokazać.

0

Tak się składa że Indy miałem na początku ale wykłada się przy pobieraniu dużych plików (przynajmniej u mnie). Często też występowały błędy połączenia.
Dlatego zrezygnowałem z Indy.
A co do mojego problemu to zapisałem ten wzorek nieco inaczej:
Round(( dwBytesRead / fileSize) *100 )

Teraz mam liczby mniejsze więc nie przekroczę zakresu DWORDa (bo chyba o to chodzi).

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