Delphi - объектно-ориентированный язык программирования, разработанный компанией Borland в 1995 году. Он основан на языке программирования Pascal, но имеет более расширенные возможности и добавлены новые функции.
Delphi является интегрированной средой разработки (IDE), которая позволяет разрабатывать программное обеспечение для различных платформ, включая Windows, macOS, Android и iOS. Delphi достигает многоплатформенности с помощью...
{ 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. } usesWinInet, 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, ... varhNet, 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 } ifhNet = 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 ifhFTP = nil
then
begin
InternetCloseHandle(hNet); ShowMessage(Format('Host "%s" is not available',[strHost])); Exit; end
;
{ Change directory } bSuccess := FtpSetCurrentDirectory(hFTP, PChar(ftpDir)); ifnot
bSuccess then
begin
InternetCloseHandle(hFTP); InternetCloseHandle(hNet); ShowMessage(Format('Cannot set directory to %s.',[ftpDir])); Exit; end
;
{ Read size of file } ifFtpFindFirstFile(hFTP, PChar(ftpFile), sRec, 0, 0) <> nil
then
begin
fileSize := sRec.nFileSizeLow;
// fileLastWritetime := sRec.lastWriteTime endelse
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. ifhFile = nil
then
begin
InternetCloseHandle(hFTP); InternetCloseHandle(hNet); Exit; end
;
{ Create a new local file } AssignFile(LocalFile, TargetFile); {$i-} Rewrite(LocalFile, 1); {$i+} ifIOResult <> 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) thenBreak;
// 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
;