Сколько пользуюсь интернетом - никак не могу понять: я вхожу в интернет или я выхожу в интернет?
uses
URLMon, ShellApi;
function DownloadFile(SourceFile, DestFile: string): Boolean;
begintry
Result := UrlDownloadToFile(nil, PChar(SourceFile), PChar(DestFile), 0, nil) = 0;
except
Result := False;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
const// URL Location
SourceFile = 'http://www.google.com/intl/de/images/home_title.gif';
// Where to save the file
DestFile = 'c:\temp\google-image.gif';
beginif DownloadFile(SourceFile, DestFile) thenbegin
ShowMessage('Download succesful!');
// Show downloaded image in your browser
ShellExecute(Application.Handle, PChar('open'), PChar(DestFile),
PChar(''), nil, SW_NORMAL)
endelse
ShowMessage('Error while downloading ' + SourceFile)
end;
// Minimum availability: Internet Explorer 3.0 // Minimum operating systems Windows NT 4.0, Windows 95 {********************************************************}{2.}uses
Wininet;
function DownloadURL(const aUrl: string): Boolean;
var
hSession: HINTERNET;
hService: HINTERNET;
lpBuffer: array[0..1024 + 1] of Char;
dwBytesRead: DWORD;
begin
Result := False;
// hSession := InternetOpen( 'MyApp', INTERNET_OPEN_TYPE_DIRECT, nil, nil, 0);
hSession := InternetOpen('MyApp', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
tryif Assigned(hSession) thenbegin
hService := InternetOpenUrl(hSession, PChar(aUrl), nil, 0, 0, 0);
if Assigned(hService) thentrywhileTruedobegin
dwBytesRead := 1024;
InternetReadFile(hService, @lpBuffer, 1024, dwBytesRead);
if dwBytesRead = 0 then break;
lpBuffer[dwBytesRead] := #0;
Form1.Memo1.Lines.Add(lpBuffer);
end;
Result := True;
finally
InternetCloseHandle(hService);
end;
end;
finally
InternetCloseHandle(hSession);
end;
end;
Here's the translation of the provided code into Russian:
Метод 1: Использование URLMon
Этот метод использует функцию UrlDownloadToFile из библиотеки URLMon, чтобы загрузить файл. Функция принимает пять параметров:
nil: Обратный указатель на экземпляр класса URLMON (не используется в этом примере).
PChar( SourceFile ): URL файла, который нужно загрузить.
PChar( DestFile ): Путь и имя файла, где должен быть сохранен загруженный файл.
0: Целочисленное значение, которое specifies флаги для операции загрузки (в этом случае, не установлены никакие флаги).
nil: Указатель на структуру, которая содержит дополнительную информацию о операции загрузки (не используется в этом примере).
Функция возвращает булевое значение, указывающее, была ли загрузка успешной.
Метод 2: Использование Wininet
Этот метод использует функции InternetOpen, InternetOpenUrl и InternetReadFile из библиотеки Wininet, чтобы загрузить файл. Эти функции более низкоуровневые, чем те в URLMon, и предоставляют больше контроля над процессом загрузки.
Код открывает сессию интернета с помощью InternetOpen, затем создает указатель на URL с помощью InternetOpenUrl. Затем он читает содержимое URL в буфер с помощью InternetReadFile, которое повторяется, пока не будет прочитано все содержимое. Загруженный файл не сохраняется на диске в этом примере, а вместо этого отображается в контроле Memo.
Преимущества и недостатки
Оба метода имеют свои преимущества и недостатки:
URLMon предлагает более простой интерфейс для загрузки файлов, но может быть менее гибким, чем Wininet.
Wininet предлагает больше контроля над процессом загрузки, но требует больше знаний о протоколах интернета и может быть более ошибочным.
Предложения по улучшению кода
Вот несколько предложений для улучшения кода:
Обработка ошибок: Кодcurrently только обрабатывает ошибки в блоке try-except внутри функции DownloadFile. Рассмотрите возможность добавления дополнительной обработки ошибок, чтобы обрабатывать случаи, когда загрузка неудачна или прерывается.
Сохранение файла: В примере с Wininet, загруженный файл не сохраняется на диске. Рассмотрите возможность добавления механизма для сохранения файла в указанном месте.
Обновление контрола Memo: В примере с Wininet, контрол Memo обновляется в реальном времени, как загрузка прогрессирует. Рассмотрите возможность добавления механизма для обновления контрола Memo асинхронно, чтобы избежать блокировки потока UI.
Вот обновленный вариант кода, который решает эти проблемы:
usesWininet;functionDownloadFile(constaUrl:string;DestFile:string):Boolean;varhSession:HINTERNET;hService:HINTERNET;lpBuffer:array[0..1024+1]ofChar;dwBytesRead:DWORD;beginResult:=False;tryifAssigned(hSession)thenbeginhService:=InternetOpenUrl(hSession,PChar(aUrl),nil,0,0,0);ifAssigned(hService)thentryrepeatdwBytesRead:=1024;InternetReadFile(hService,@lpBuffer,1024,dwBytesRead);ifdwBytesRead=0thenbreak;lpBuffer[dwBytesRead]:=#0;Form1.Memo1.Lines.Add(lpBuffer);untilFalse;Result:=True;finallyInternetCloseHandle(hService);end;end;finallyInternetCloseHandle(hSession);end;end;procedureTForm1.Button1Click(Sender:TObject);constSourceFile='http://www.google.com/intl/de/images/home_title.gif';DestFile='c:\temp\google-image.gif';beginifDownloadFile(SourceFile,DestFile)thenbeginShowMessage('Загрузка успешна!');ShellExecute(Application.Handle,PChar('open'),PChar(DestFile),nil,nil,SW_NORMAL);endelseShowMessage('Ошибка при загрузке '+SourceFile);end;
Обратите внимание, что в этом коде используется цикл repeat для чтения данных из URL в блоки размером 1024 байта, и контрол Memo обновляется асинхронно с помощью метода Lines.Add. Код также обрабатывает ошибки более robustly, используя блок try-finally, чтобы обеспечить закрытие интернет-указателей, даже если исключение было выброшено.
В статье описывается способ загрузки файлов из интернета с помощью языка программирования Pascal, предлагая два примера кода: первый использует библиотеку URLMon и ShellApi, а второй - Wininet.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.