Download a file from a FTP Server

原创 2002年05月10日 09:51:00
{**************************************************************}
  The following function shows how to connect to a ftp server
  and download a file.

  Specify the Host, User, Password, Port, Ftp-Directory,
  File on Ftp, the local file.
  
  You need a TProgressBar to show the progress and a TLabel to
  show some progress informations.

  Note: The functions from wininet.dll are used.

{**************************************************************}

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;

【阿里云】WindowsServer2012 搭建FTP站点 图文记录

图文教程,备忘查阅。
  • GeekLei
  • GeekLei
  • 2014年06月30日 18:38
  • 33992

细说ftp服务器的搭建部署及权限管理

摘要:        FTP 是File TransferProtocol(文件传输协议)的英文简称,中文简称为“文传协议”。用于Internet上的控制文件的双向传输。同时,它也是一个应用程序(...
  • zx_canway
  • zx_canway
  • 2017年06月09日 13:17
  • 397

ubuntu14.04 server ftp 服务安装配置详解

ubuntu14.04 server ftp 服务安装配置详解cheungmine2016-01-270 安装好vsftpd服务安装$ sudo apt-get install vsftpd关闭,启动...
  • cheungmine
  • cheungmine
  • 2016年01月27日 19:04
  • 7235

FileZilla FTP Server在win2008安装及防火墙设置

FileZilla FTP Server在win2008安装及防火墙设置   FileZilla FTP Server在win2008安装及防火墙设置 近期,在win 2008 server平台...
  • Bayden_Hu
  • Bayden_Hu
  • 2015年11月05日 11:04
  • 2911

使用FileZilla Server轻松搭建个人FTP服务器

FileZilla server配置 双击运行“FileZilla Server Interface.exe”,会提示你连接到服务器,什么都不用设置,直接点确定进入运行界面,会提示你已成功连...
  • hbuxiaofei
  • hbuxiaofei
  • 2015年05月25日 19:45
  • 6792

NAT后的FTP Server如何配置

今天遇到一个问题:公司开发的系统,在客户机房上线后,因为FTP服务器不能直接挂接在外网上,必须通过在路由器上进行NAT映射方式。     假设我们的路由器外网IP为1.2.3.4,FTP的内网IP为...
  • zhang_qxian
  • zhang_qxian
  • 2016年05月06日 16:24
  • 3889

java 文件的上传下载(File Download)

前面我们刚刚学完文件上传,那么我们就接着来看和文件上传相对应的文件下载吧。对于文件上传而言,文件下载实现起来要简单的多。通常我们可以直接将一个超链接的地址指向我们想要给用户下载的资源即可。但是如果这些...
  • u012730333
  • u012730333
  • 2015年03月04日 21:33
  • 1000

利用File Zilla在AWS的EC2虚拟机上建FTP传输文件(Win系统)

因为要下载代码但是VPN不稳定(我下的是Chromium,gclient每次断了就重来),所以曲线救国使用AWS虚拟机下载,再从虚拟机上用FTP传回本地。 总结一下希望能帮到其他朋友和以后的自己: ...
  • chuachua66
  • chuachua66
  • 2015年11月24日 10:43
  • 5712

HTTP和FTP上传文件的比较

Transfer SpeedPossibly the most common question: which is faster for transfers?Given all details on ...
  • iefreer
  • iefreer
  • 2014年10月20日 22:44
  • 5401

简单FTP服务器搭建教程

简单FTP服务器搭建教程
  • beautiful_face
  • beautiful_face
  • 2017年01月03日 22:11
  • 1149
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Download a file from a FTP Server
举报原因:
原因补充:

(最多只允许输入30个字)