Интернет-решения от доктора Боба

       

DrBob FTP


WinInet использует не что, что они назвали Интернет хендл "internet handle" (очень похоже на Windows handles), и все API функции или нуждаются или возвращают Интернет хендл. Например, что бы открыть новую WinInet сессию, нам нужно вызвать функцию InternetOpen, которая вернет Интернет хендл, который мы должны использовать до конца сессии (и передавать другим API функциям). Для освобождения хендла, мы всегда должны вызывать функцию InternetCloseHandle (после получения хендла мы можем его использовать, но мы обязаны написать блок try-finally, где должны освободить хендл в разделе finally).

Для открытия удаленного файла (или URL) в Интернете, мы должны вызвать функцию InternetOpenURL, которая опять вернет нам хендл. Теперь, для загрузки удаленного файла (URL) на нашу локальную машину, нам осталось сделать только некоторое количество вызовов функции InternetReadFile, очень похожей на функцию BlockRead, которая копирует данные из удаленного файла в буфер данных. Мы можем использовать BlockWrite для записи из буфера в локальный файл, и все это с помощью всего лишь трех WinInet функций (четыре, если считать функцию InternetCloseHandle), мы можем написать простую, но очень быструю FTP программу следующим образом:

  program

DrBobFTP;

  {$APPTYPE CONSOLE}

  {$I+}

  uses

    Windows, WinInet;

    procedure

CopyURL(const URL, OutputFile: String);

    const

      BufferSize = 1024;

    var

      hSession, hURL: HInternet;

      Buffer: Array[0..Pred(BufferSize)] of Byte;

      BufferLength: DWORD;



      f: File;

    begin

      hSession := InternetOpen('DrBob',INTERNET_OPEN_TYPE_PRECONFIG,nil,nil,0);

      try

        hURL := InternetOpenURL(hSession, PChar(URL), nil,0,0,0);

        try

          Assign(f, OutputFile);

          Rewrite(f,1);

          repeat

            InternetReadFile(hURL, @Buffer, BufferSize, BufferLength);

            write('.');

            BlockWrite(f, Buffer, BufferLength)

          until

BufferLength = 0;

          Close(f);

          writeln('OK') { if we get here, we succeeded }

        finally

          InternetCloseHandle(hURL)

        end

      finally

        InternetCloseHandle(hSession)

      end

    end;

  begin

    if

ParamCount <2 >then

    begin

      writeln('Usage: DrBobFTP URL Filename');

      writeln('Example: DrBobFTP http://www.drbob42.com/ftp/headconv.zip hc.zip')

    end

    else

      CopyURL(ParamStr(1), ParamStr(2))

  end.

Конечно, для выполнения данной программы мы также обязаны иметь WinInet.DLL, которая также может быть найдена на Microsoft web сайте.



Содержание раздела