Как скачать любой URL используя стандартные настройки сети
- Почему русские не выдвигаются в правительство Норвегии?
- А вы хотите, чтобы у вас был е-майл premier-ministr@gov.no?
Начиная с Internet Explorer 3, Microsoft поддерживает очень полезные API, Wininet. Эти функции позволяют использовать все возможности IE, такие как настройки прокси, кэширование файлов и т.д.
Ниже приведён пример использования этих функций для скачивания файла с нужного URL. Это может быть любой доступный URL, ftp://, http://, gopher://, и т.д.
Более подробную информацию об этих функция можно посмотреть в MSDN - Win32 Internet API Functions.
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) thenbegin
UrlHandle := InternetOpenUrl(NetHandle, PChar(Url), nil, 0, INTERNET_FLAG_RELOAD, 0);
{ UrlHandle правильный? Начинаем загрузку }if Assigned(UrlHandle) thenbegin
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);
endelsebegin{ UrlHandle неправильный. Генерируем исключительную ситуацию. }raise Exception.CreateFmt('Cannot open URL %s', [Url]);
end;
InternetCloseHandle(NetHandle);
endelse{ NetHandle недопустимый. Генерируем исключительную ситуацию }raise Exception.Create('Unable to initialize Wininet');
end;
//-------------------------------------------------implementationuses
SysUtils,Windows,ShlObj;
function NetShareAdd(ServerName:PChar; //указатель на имя компьютера, например '\\Server'#0, если свой, то можно nil
Level:Word; //уровень структуры Share_info, здесь 50
PShareInfo:PChar; //указатель на структуру Share_Info
ParmErr:DWord) //указатель на ???
:dword;stdcall;external 'svrapi.dll';//svrapi для Win9X, NetApi32 для NTfunction NetShareDel(ServerName:PChar;
NetName:PChar;
Reserved:DWord):dword;stdcall;external 'svrapi.dll';
type
_share_info_50 = record//структура Share уровня 50
NetName: array [1..13] of char; //Как будет называться диск в сети
SType: byte; //тип =0 (STYPE_DISKTREE) - шарить диски
Flags: word; //флаги $0191,$0192,$0193....(доступ из сети)
Remark: PChar; //указатель на комментарий, видимый из сети
Path: PChar; //указатель на имя ресурса, например 'c:\'#0
RW_Password: array [1..9] of char; //пароль для полного доступа, если не нужен =#0
RO_Password: array [1..9] of char; //пароль для доступа на чтение, если не нужен =#0end;
//----------------------------function SetShareOnDisk(HostName,LocalPath:string; NetName:TNetName;Remark:string;
Access:word;RO_Passw,RW_Passw:TPassw):boolean; var ShareInfo:_Share_Info_50;
begin
Result:=false;
StrPCopy(@ShareInfo.NetName,NetName);
ShareInfo.SType:=0;
ShareInfo.Flags:=Access;
ShareInfo.Remark:=PChar(Remark);
ShareInfo.Path:=PChar(LocalPath);
StrPCopy(@ShareInfo.RO_Password,RO_Passw);
StrPCopy(@ShareInfo.RW_Password,RW_Passw);
ShareResult:=NetShareAdd(PChar(HostName), 50,@ShareInfo,$0000002a); //вызываем Shareif ShareResult <> 0 then//расшарить неудалось
Exit;
SHChangeNotify(SHCNE_NETSHARE,SHCNF_PATH,PChar(LocalPath),nil); //сказать шеллу об изменениях
Result:=true;
end;
//----------------------------function RemoveShareFromDisk(HostName, NetName, LocalPath: string): boolean;
begin
Result:=false;
ShareResult:=NetShareDel(PChar(HostName),PChar(NetName),0); //удалить шаруif ShareResult <> 0 then
Exit;
SHChangeNotify(SHCNE_NETUNSHARE, SHCNF_PATH,PChar(LocalPath),nil); //сказать шеллу об изменениях
Result:=true;
end;
end.
Программа на Delphi!
Код содержит функцию DownloadFile для скачивания любого URL с использованием стандартных сетевых настроек, а также функции SetShareOnDisk и RemoveShareFromDisk для управления разделами на диске.
Давайте разбить каждый раздел:
DownloadFile
functionDownloadFile(constUrl:string):string;
Эта функция принимает URL в качестве входного параметра и скачивает его содержимое. Она использует API Wininet, которая является частью Windows, для выполнения скачивания. Функция возвращает скачанные файловые содержимое в виде строки.
Работа функции происходит следующим образом:
Инициализируем функцию InternetOpen для создания сеанса интернета.
Создаем новый.handle для URL с помощью InternetOpenUrl.
Проверяем, является ли handle URL валидным, и начинаем скачивать содержимое.
Читаем содержимое по частям (1024 байта за раз) и добавляем его к буферу.
Повторяем шаг 4, пока не будет доступно больше данных.
Закрываем handle URL и возвращаем скачанные файловые содержимое.
Эта функция удаляет раздел с диска. Она принимает три параметра:
HostName: имя хоста.
NetName: имя раздела, который нужно удалить.
LocalPath: локальный путь к папке, которую нужно удалить.
Функция использует API NetShareDel для удаления раздела и уведомляет оболочку о изменении с помощью SHChangeNotify.
В целом, этот код предоставляет полезный набор функций для работы с URL и разделами на диске.
Скачать любой URL используя стандартные настройки сети можно с помощью API Wininet, начиная от Internet Explorer 3.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.