как в виниете реализовать возможность докачки файла с некоторой позиции. Я пробовал InternetSetFilePointer — не помогает. Все равно InternetReadFile скачивает файл с начала...
Здравствуйте, alevd, Вы писали:
A>как в виниете реализовать возможность докачки файла с некоторой позиции. Я пробовал InternetSetFilePointer — не помогает. Все равно InternetReadFile скачивает файл с начала...
В http докачка производится за счет заголовка
Range:, в ftp — retr с указанием старт-позиции.
А вот в WinInet — доки надо читать, либо не пользоваться WinInet, а делать все вручную. Тем более, что это не сложно.
Здравствуйте, 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 >>