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

Советы » Интернет » Присоединиться к 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

;

Другое по теме:

Категории

Статьи

Советы

Copyright © 2022 - All Rights Reserved - www.delphirus.com