Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Как начать скач. файл а с опред. места


Автор: devmstr 29.1.2005, 22:52
Как начать скачивать файл не сначала а с определенной позиции.
Вот пример из DRKB, который просто закачивает файл. Люди подскажите. Очень нужно!!!!

Код

function DownloadFile(const Url: string): string;
var
 NetHandle: HINTERNET;
 UrlHandle: HINTERNET;
 Buffer: array[0..1024] of char;
 BytesRead: cardinal;
begin
 Result := '';
 NetHandle := InternetOpen('Delphi 5.x', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);

 if Assigned(NetHandle) then
   begin

     UrlHandle := InternetOpenUrl(NetHandle, PChar(Url), nil, 0, INTERNET_FLAG_RELOAD, 0);

     if Assigned(UrlHandle) then
{ UrlHandle правильный? Начинаем загрузку }
       begin
         FillChar(Buffer, SizeOf(Buffer), 0);
         repeat
           Result := Result + Buffer;
           FillChar(Buffer, SizeOf(Buffer), 0);
           InternetReadFile(UrlHandle, @Buffer, SizeOf(Buffer), BytesRead);
         until BytesRead = 0;
         InternetCloseHandle(UrlHandle);
       end
     else
       begin
{ UrlHandle неправильный. Генерируем исключительную ситуацию. }
         raise Exception.CreateFmt('Cannot open URL %s', [Url]);
       end;

     InternetCloseHandle(NetHandle);
   end
 else
{ NetHandle недопустимый. Генерируем исключительную ситуацию }
   raise Exception.Create('Unable to initialize Wininet');
end;


Автор: p0s0l 29.1.2005, 23:59
М
 
Тему нужно создавать в нужном разделе!


Автор: p0s0l 29.1.2005, 23:59
Перенесено из раздела Дельфи
Добавлено @ 00:02
Перед циклом InternetReadFile вызови InternetSetFilePointer для установки позиции скачивания...
Код
InternetSetFilePointer (UrlHandle, <начало скачки>, 0, FILE_BEGIN, 0);


Автор: devmstr 30.1.2005, 08:41
Громадное спасибо!!
Щас попробую!

Автор: devmstr 30.1.2005, 23:42
А вы не подскажете как определить заранее размер закачиваемого файла?

Автор: devmstr 31.1.2005, 00:38
Пробую InternetQueryDataAvailable, но он мне возвращает что-то нереальное.
Хотя вреде как-раз, то что необходимо?

Queries the server to determine the amount of data available.

Syntax
Код

BOOL InternetQueryDataAvailable(
   IN HINTERNET hFile,
   OUT LPDWORD lpdwNumberOfBytesAvailable,
   IN DWORD dwFlags,
   IN DWORD dwContext
);


Parameters

hFile
Valid HINTERNET handle, as returned by InternetOpenUrl, FtpOpenFile, GopherOpenFile, or HttpOpenRequest.

lpdwNumberOfBytesAvailable
Optional. Address of an unsigned long integer variable that receives the number of available bytes.

dwFlags
Reserved. Must be set to zero.
dwContext
Reserved. Must be set to zero.

Например файл 241,534 bytes(ну примерно), а функция возращает 751...
Что делать??

Автор: p0s0l 31.1.2005, 08:40
Можешь попробовать так:
Код
FileSize := InternetSetFilePointer (UrlHandle, 0, 0, FILE_END, 0);
Только потом верни указатель на нужное тебе место...

Добавлено @ 08:44
ЗЫ: только в MSDN сказано, что и так может обламаться:
Цитата(MSDN)
This method fails if the content length is unknown.

Добавлено @ 08:48
А InternetQueryDataAvailable - это не то...
Читай:
Цитата(MSDN)
This function returns the number of bytes of data that are available to be read immediately by a subsequent call to InternetReadFile.
Т.е. она возвращает кол-во байт, которые доступны для мгновенного считывания в последующем вызове InternetReadFile...

Автор: devmstr 31.1.2005, 09:41
Спасибо!
Бли immediately не заметил! Заработался smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)