Ściaganie plików z neta

0

Witam

mam kodzik

procedure TForm2.PobierzCzlonkow(Sender: TObject);
var
 adresURL,nazwaPliku            :String;
 plik                           :File;
 inOpen,inURL                   :HINTERNET;
 rozmiar,ileZnakow,rozmiarPliku :DWORD;
 dwBufLen, dwIndex, sciagnieto  :DWord;
 bufor :array[1..1024] of byte;
 buf   :Pointer;
 i: integer;
Begin
 for i := 1 to Memo1.Lines.Count do
 begin
 //ustawiamy dane...
 inOpen:= nil; inURL:= nil;
 rozmiarPliku:= 0;
 rozmiar:= 0;
 ProgressBar1.Position:= 0;
 //zmienna z adresem URL z którego ściągamy plik
 adresURL:= PobierzAdres(Edit1.Text)+Memo1.Lines[i];
 {zmienna z nazwą pliku jaka ma być po ściągnięciu
  - można wyciągnąć nazwe pliku z adresu URL}
 nazwaPliku:= 'c:\VendettaPliki\player'+IntToStr(i)+'.html';

 //pobieramy rozmiar pliku jeżeli coś już ściągaliśmy...
 if FileExists(nazwaPliku) then
 begin
   AssignFile(plik, nazwaPliku);
   Reset(plik, 1);
   rozmiarPliku:= FileSize(plik); //pobieramy rozmiar pliku
   Seek(plik, FileSize(plik));    //ustawiamy skażnik na końcu pliku
 end
 else
 begin
   AssignFile(plik,nazwaPliku);
   ReWrite(plik, 1);
 end;

 Try
   //łączymy się z serwerem...
   Label1.Caption:='Łączenie...';
   Application.ProcessMessages;
   inOpen:= InternetOpen('Mozilla',PRE_CONFIG_INTERNET_ACCESS,nil,nil,0);
   inURL:= InternetOpenURL(inOpen,PChar(adresURL),'Accept: */*', StrLen('Accept: */*'),0,0);
   if not (inURL <> nil) then
   begin
     ShowMessage('Nie można uzyskać połączenia');
     Stop:= True;
     InternetCloseHandle(inURL);
     InternetCloseHandle(inOpen);
     CloseFile(plik);
     Exit;
   end;

   //pobieramy całkowity rozmiar pliku znajdującego sie na serwerze...
   dwIndex:= 0;
   dwBufLen:= 1024;
   GetMem(Buf, dwBufLen);
   HttpQueryInfo(inURL, HTTP_QUERY_CONTENT_LENGTH,buf, dwBufLen,dwIndex);
   //ustawiamy progresy (paski postępu)
   rozmiar:= StrToInt(StrPas(Buf));
   Caption:= 'Rozmiar pliku do ściągnięcia: '+ IntToStr(rozmiar);
   ProgressBar1.Max:= rozmiar;
   ProgressBar1.Position:= rozmiarPliku;

   { ustawiamy wskażnik pliku znajdującego się na serwerze, czyli
   ustalamy od jakiego miejsca w pliku rozpoczynamy pobieranie }
   if rozmiarPliku > 0 then InternetSetFilePointer(inURL,rozmiarPliku,nil,0,0);

   //pobieranie pliku z serwera...
   Label1.Caption:='Ściąganie pliku...';
   while (ileZnakow <> 0) and (Stop = false) do
   begin
     InternetReadFile(inURL, @bufor, SizeOf(bufor),ileZnakow);
     InternetQueryDataAvailable(inURL,rozmiar, 0, 0);
     BlockWrite(plik, bufor,ileZnakow);
     sciagnieto:= FileSize(plik);
     Label1.Caption:='Ściągnięto '+ IntToStr(sciagnieto);
     ProgressBar1.Position:= sciagnieto;
     Application.ProcessMessages;
   end;

 except
   ShowMessage('Wystąpił błąd podczas ściągania pliku !');
   Stop:= True;
   InternetCloseHandle(inURL);
   InternetCloseHandle(inOpen);
   CloseFile(plik);
   Exit;
 end;

 Stop:= False;
 InternetCloseHandle(inURL);
 InternetCloseHandle(inOpen);
 CloseFile(plik);
 if ProgressBar1.Position = ProgressBar1.Max then
    Label1.Caption:= 'Plik został ściągnięty'
    else Label1.Caption:= 'Zatrzymane ściąganie pliku';
 Beep;
 end;
End;

I kiedy nie używam pętli to ściaga poprawnie jedne plik. Tylko że ja mam do ściagniecia ~150plików i wrzuciłem ten kod w petle to wtedy ściaga mi puse pliki.

Co zrobiłem żle???

0

Nie przyglądałem się kodowi ale najprawdopodobniej w tej pętli każda kolejna ineracja nie czeka aż plik się ściągnie, przez co nic do tego pliku się nie zdąża zapisać.

0

a jak to poprawic??

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