Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

Видеокурс программиста и крэкера 5D 2O17
(актуальность: октябрь 2O17)
Свежие инструменты, новые видеоуроки!

  • 400+ видеоуроков
  • 800 инструментов
  • 100+ свежих книг и статей

УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

БОЛЬШОЙ FAQ ПО DELPHI



Присоединиться к FTP серверу и загрузить с него файл

Сидят две бабульке на скамейке, около дома и интенсивно что-то обсуждают. Идет программист... ”Какой трафик!!!” - подумал программер.


 {
   The following function shows how to connect to a ftp server
   and download a file.
   It uses the functions from wininet.dll.
 
   You need a ProgressBar to show the progress and a Label to show progress informations.
 }
 
 uses
   WinInet, ComCtrls;
 
 function FtpDownloadFile(strHost, strUser, strPwd: string;
   Port: Integer; ftpDir, ftpFile, TargetFile: string; ProgressBar: TProgressBar): Boolean;
 
   function FmtFileSize(Size: Integer): string;
   begin
     if Size >= $F4240 then
       Result := Format('%.2f', [Size / $F4240]) + ' Mb'
     else
     if Size < 1000 then
       Result := IntToStr(Size) + ' bytes'
     else
       Result := Format('%.2f', [Size / 1000]) + ' Kb';
   end;
 
 const
   READ_BUFFERSIZE = 4096;  // or 256, 512, ... 
 var
   hNet, hFTP, hFile: HINTERNET;
   buffer: array[0..READ_BUFFERSIZE - 1] of Char;
   bufsize, dwBytesRead, fileSize: DWORD;
   sRec: TWin32FindData;
   strStatus: string;
   LocalFile: file;
   bSuccess: Boolean;
 begin
   Result := False;
 
   { Open an internet session }
   hNet := InternetOpen('Program_Name', // Agent 
                         INTERNET_OPEN_TYPE_PRECONFIG, // AccessType 
                         nil,  // ProxyName 
                         nil, // ProxyBypass 
                         0); // or INTERNET_FLAG_ASYNC / INTERNET_FLAG_OFFLINE 
 
   {
     Agent contains the name of the application or
     entity calling the Internet functions
   }
 
 
   { See if connection handle is valid }
   if hNet = nil then
   begin
     ShowMessage('Unable to get access to WinInet.Dll');
     Exit;
   end;
 
   { Connect to the FTP Server }
   hFTP := InternetConnect(hNet, // Handle from InternetOpen 
                           PChar(strHost), // FTP server 
                           port, // (INTERNET_DEFAULT_FTP_PORT), 
                           PChar(StrUser), // username 
                           PChar(strPwd),  // password 
                           INTERNET_SERVICE_FTP, // FTP, HTTP, or Gopher? 
                           0, // flag: 0 or INTERNET_FLAG_PASSIVE 
                           0);// User defined number for callback 
 
   if hFTP = nil then
   begin
     InternetCloseHandle(hNet);
     ShowMessage(Format('Host "%s" is not available',[strHost]));
     Exit;
   end;
 
   { Change directory }
   bSuccess := FtpSetCurrentDirectory(hFTP, PChar(ftpDir));
 
   if not bSuccess then
   begin
     InternetCloseHandle(hFTP);
     InternetCloseHandle(hNet);
     ShowMessage(Format('Cannot set directory to %s.',[ftpDir]));
     Exit;
   end;
 
   { Read size of file }
   if FtpFindFirstFile(hFTP, PChar(ftpFile), sRec, 0, 0) <> nil then
   begin
     fileSize := sRec.nFileSizeLow;
     // fileLastWritetime := sRec.lastWriteTime 
   end else
   begin
     InternetCloseHandle(hFTP);
     InternetCloseHandle(hNet);
     ShowMessage(Format('Cannot find file ',[ftpFile]));
     Exit;
   end;
 
   { Open the file }
   hFile := FtpOpenFile(hFTP, // Handle to the ftp session 
                        PChar(ftpFile), // filename 
                        GENERIC_READ, // dwAccess 
                        FTP_TRANSFER_TYPE_BINARY, // dwFlags 
                        0); // This is the context used for callbacks. 
 
   if hFile = nil then
   begin
     InternetCloseHandle(hFTP);
     InternetCloseHandle(hNet);
     Exit;
   end;
 
   { Create a new local file }
   AssignFile(LocalFile, TargetFile);
   {$i-}
   Rewrite(LocalFile, 1);
   {$i+}
 
   if IOResult <> 0 then
   begin
     InternetCloseHandle(hFile);
     InternetCloseHandle(hFTP);
     InternetCloseHandle(hNet);
     Exit;
   end;
 
   dwBytesRead := 0;
   bufsize := READ_BUFFERSIZE;
 
   while (bufsize > 0) do
   begin
     Application.ProcessMessages;
 
     if not InternetReadFile(hFile,
                             @buffer, // address of a buffer that receives the data 
                             READ_BUFFERSIZE, // number of bytes to read from the file 
                             bufsize) then Break; // receives the actual number of bytes read 
 
     if (bufsize > 0) and (bufsize <= READ_BUFFERSIZE) then
       BlockWrite(LocalFile, buffer, bufsize);
     dwBytesRead := dwBytesRead + bufsize;
 
     { Show Progress }
     ProgressBar.Position := Round(dwBytesRead * 100 / fileSize);
     Form1.Label1.Caption := Format('%s of %s / %d %%',[FmtFileSize(dwBytesRead),FmtFileSize(fileSize) ,ProgressBar.Position]);
   end;
 
   CloseFile(LocalFile);
 
   InternetCloseHandle(hFile);
   InternetCloseHandle(hFTP);
   InternetCloseHandle(hNet);
   Result := True;
 end;
 




<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ



Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS