Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »

Почтовая рассылка

Подписчиков: 11642
Последний выпуск: 19.06.2015

Простой способ скачивания файла по HTTP

Если ваша программа содержит подключаемые модули (BPL или DLL) или есть необходимость обновлять саму программу, то наверняка стояла проблема обновления копий программы. С развитием Internet появилась прекрасная возможность сделать это быстро и красиво. В данной статье мы расскажем, как добавить опцию автообновления программ из Internet.

Delphi дает нам полный доступ к API WinInet (wininet.pas), что позволяет подключиться и скачать любой файл с указанного вебсайта, используя протоколы FTP или HTTP. Например, мы можем использовать функции API WinInet для создания FTP-браузера или программы для поиска на публичных FTP-серверах заданных файлов.

Основная функция нашей программы - GetInetFile:

uses Wininet; 

function GetInetFile(const fileURL, FileName: String): boolean;
const BufferSize = 1024;
var hSession, hURL: HInternet;
Buffer: array[1..BufferSize] of Byte;
BufferLen: DWORD;
f: File;
sAppName: string;
begin
   Result:=False;
   sAppName := ExtractFileName(Application.ExeName);
   hSession := InternetOpen(PChar(sAppName), INTERNET_OPEN_TYPE_PRECONFIG,
         nil, nil, 0);
   try
      hURL := InternetOpenURL(hSession,
      PChar(fileURL),nil,0,0,0);
      try
         AssignFile(f, FileName);
         Rewrite(f,1);
         repeat
            InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen);
            BlockWrite(f, Buffer, BufferLen)
         until BufferLen = 0;
         CloseFile(f);
         Result:=True;
      finally
      InternetCloseHandle(hURL)
      end
   finally
   InternetCloseHandle(hSession)
   end
end; 

Замечание: конечно, этот пример нужно расширить, вставив, например, код для отображения прогресса скачивания в цикл.

Использовать функцию GetInetFile очень просто:

var FileOnNet, LocalFileName: string
begin
   FileOnNet:='http://www.codenet.ru/export/forum.xml';
   LocalFileName:='codenet.xml'; 

   if GetInetFile(FileOnNet,LocalFileName)=True then
      ShowMessage('Download successful')
   else
      ShowMessage('Error in file download') 

end; 

Этот кусок кода скачивает файл с http://www.codenet.ru/export/forum.xml и записывает его в текущий каталог под именем 'codenet.xml'. Все очень просто.

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 

Комментарии

1.
94K
14 октября 2014 года
Илюха Кучальский
0 / / 14.10.2014
+1 / -0
Мне нравитсяМне не нравится
14 октября 2014, 18:43:57
А что если потеряется соединение - прога зависнет!!!?
Как этого избежать (установить новое соединение и докачать файл?
2.
93K
22 февраля 2014 года
Сергей Скепко
0 / / 22.02.2014
Мне нравитсяМне не нравится
22 февраля 2014, 15:37:27
и антивирус распознает как вирус программу...с вашим кодом)
3.
93K
22 февраля 2014 года
Сергей Скепко
0 / / 22.02.2014
Мне нравитсяМне не нравится
22 февраля 2014, 15:35:57
а если мне надо с фтп скачать, где надо указать логин и пароль?
4.
91K
02 сентября 2013 года
juliya-kazakova123
0 / / 02.09.2013
Мне нравитсяМне не нравится
2 сентября 2013, 20:41:36
Прикольно ^_^
5.
Аноним
+0 / -2
Мне нравитсяМне не нравится
1 февраля 2006, 12:42:39
var FileOnNet, LocalFileName: string;


procedure TForm1.Button1Click(Sender: TObject);
begin
FileOnNet:='http://www.codenet.ru/export/forum.xml';
LocalFileName:='codenet.xml';

if GetInetFile(FileOnNet,LocalFileName)=True then
ShowMessage('Download successful')
else
ShowMessage('Error in file download')
end;
6.
Аноним
+1 / -0
Мне нравитсяМне не нравится
1 ноября 2005, 14:28:04
в C++Builder6 - IdHTTP и IdFTP (Indy Clients)

AnsiString LoadPath = "http://www.codenet.ru/export/forum.xml"
TFileStream *myStream = new TFileStream("c:\\forum.xml",fmCreate);
IdHTTP1->Get(LoadPath, myStream);
FileClose(myStream->Handle);
7.
Аноним
+0 / -1
Мне нравитсяМне не нравится
1 ноября 2005, 09:49:27
uses urlmon; {$apptype console}
var i : hresult;
begin
if ParamCount <> 2 then begin
writeln ('format: wload <url> <file>'); exit;
end;
i := URLDownloadToFile (nil, pchar (ParamStr (1)), pchar (ParamStr (2)), 0, nil);
if i <> 0 then writeln ('download error : ', i);
end.
8.
Аноним
Мне нравитсяМне не нравится
31 октября 2005, 22:36:00
Имхо, все же лучше такие вещи писать с использованием сокетов.
9.
Аноним
Мне нравитсяМне не нравится
31 октября 2005, 14:29:26
Чтобы показывать прогресс, хорошо-бы узнать размер качаемого файла. ?
10.
Аноним
Мне нравитсяМне не нравится
31 октября 2005, 12:22:07
может кто знает как программно перевести IE в режим Online?
11.
Аноним
Мне нравитсяМне не нравится
30 октября 2005, 22:14:48
Угу, так и сделали в Shareaza 2.2.0.0

В результате если Internet Explorer в offline режиме, или если включена Усиленная Конфигурация Безопасности - ничего не работало нафиг.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог