помогите сделать докачку файлов в WinInet
От: alevd  
Дата: 24.06.03 00:34
Оценка:
как в виниете реализовать возможность докачки файла с некоторой позиции. Я пробовал InternetSetFilePointer — не помогает. Все равно InternetReadFile скачивает файл с начала...
Re: помогите сделать докачку файлов в WinInet
От: DSD Россия http://911.ru/cv
Дата: 25.06.03 10:22
Оценка:
Здравствуйте, alevd, Вы писали:

A>как в виниете реализовать возможность докачки файла с некоторой позиции. Я пробовал InternetSetFilePointer — не помогает. Все равно InternetReadFile скачивает файл с начала...


В http докачка производится за счет заголовка Range:, в ftp — retr с указанием старт-позиции.

А вот в WinInet — доки надо читать, либо не пользоваться WinInet, а делать все вручную. Тем более, что это не сложно.
--
DSD
докачка файлов в WinInet для HTTP
От: akasoft Россия  
Дата: 26.06.03 17:54
Оценка: 25 (2)
Здравствуйте, DSD, Вы писали:

A>>как в виниете реализовать возможность докачки файла с некоторой позиции. Я пробовал InternetSetFilePointer — не помогает. Все равно InternetReadFile скачивает файл с начала...


Для HTTP. Посмотреть RFC 2068 (можно на русском языке) и обратить внимание на Range и Range Units, а также примеры в разделе 14.36.

Для первых 500 байт документа это будет "Range: bytes=0-499",
для следующих 500 байт — "Range: bytes=500-999".

После того, как станет ясно, что надо отправить HTTP-серверу следует вернуться к WinInet API.

После вызова HttpOpenRequest() следует вызвать HttpAddRequestHeaders() и добавить нужный заголовок.

Например так.

var
  ...
  FRootHandle, FSessionHandle, FRequestHandle: HINTERNET; // InternetOpen, InternetConnect
  FUrlComponents: TURLComponents; // Элементы url
  SAccept: String;
  S: String;
  ...
begin
  ...

  SAccept := '*/*';
  SetString(S, FUrlComponents.lpszUrlPath, FUrlComponents.dwUrlPathLength);

  //
  FRequestHandle := HttpOpenRequest(FSessionHandle, 'GET',
    PChar(S), 'HTTP/1.1', nil, @SAccept,
    INTERNET_FLAG_RELOAD or INTERNET_FLAG_PRAGMA_NOCACHE,
    0);

  if not HttpAddRequestHeaders(FRequestHandle,
    'Range: bytes=0-499'#13#10,
    DWORD(-1), HTTP_ADDREQ_FLAG_ADD) then
      // HttpAddRequestHeaders fail

  ...


За описанием передаваемых функциям параметров придётся смотреть документацию WinInet SDK или MSDN.
... << RSDN@Home 1.0 beta 7a >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.