zoukankan      html  css  js  c++  java
  • delphi实现FTP下载

    unit WLFtp;

    interface

    uses
               Windows, Messages, Variants,SysUtils, Classes, Wininet, Dialogs;

    type
               TWLFtp = class(TObject)

               private
                           FInetHandle: HInternet; // 句柄
                           FFtpHandle: HInternet; // 句柄

                           FHost: string; // 主机IP地址
                           FUserName: string; // 用户名
                           FPassword: string; // 密码
                           FPort: integer; // 端口

                           FCurrentDir: string; // 当前目录

               public
                           constructor Create;virtual;
                           destructor Destroy;override;

                           function Connect: boolean;
                           function Disconnect: boolean;

                           function UploadFile(RemoteFile: PChar; NewFile: PChar): boolean;
                           function DownloadFile(RemoteFile: PChar; NewFile: PChar): boolean;

                           function CreateDirectory(Directory: PChar): boolean;

                           function LayerNumber(dir: string): integer;
                           function MakeDirectory(dir: string): boolean;
                           function FTPMakeDirectory(dir: string): boolean;
                           function IndexOfLayer(index: integer; dir: string): string;
                           function GetFileName(FileName: string): string;
                           function GetDirectory(dir: string): string;

                           property InetHandle: HInternet read FInetHandle write FInetHandle;
                           property FtpHandle: HInternet read FFtpHandle write FFtpHandle;
                           property Host: string read FHost write FHost;
                           property UserName: string read FUserName write FUserName;
                           property Password: string read FPassword write FPassword;
                           property Port: integer read FPort write FPort;

                           property CurrentDir: string read FCurrentDir write FCurrentDir;

    end;


    implementation

    //-------------------------------------------------------------------------
    // 构造函数
    constructor TWLFtp.Create;
    begin
               inherited Create;

    end;

    //-------------------------------------------------------------------------
    // 析构函数
    destructor TWLFtp.Destroy;
    begin

               inherited Destroy;
    end;

    //-------------------------------------------------------------------------
    // 链接服务器
    function TWLFtp.Connect: boolean;
    begin
               try
                           Result := false;
                           // 创建句柄
                           FInetHandle := InternetOpen(PChar('KOLFTP'), 0, nil, nil, 0);
                           FtpHandle := InternetConnect(FInetHandle, PChar(Host), FPort, PChar(FUserName),
                                                                           PChar(FPassword), INTERNET_SERVICE_FTP, 0, 255);
                           if Assigned(FtpHandle) then
                           begin
                                       Result := true;
                           end;

               except
                           Result := false;
               end;
    end;

    //-------------------------------------------------------------------------
    // 断开链接
    function TWLFtp.Disconnect: boolean;
    begin
               try
                           InternetCloseHandle(FFtpHandle);
                           InternetCloseHandle(FInetHandle);
                           FtpHandle:=nil;
                           inetHandle:=nil;

                           Result := true;
               except
                           Result := false;
               end;
    end;

    //-------------------------------------------------------------------------
    // 上传文件
    function TWLFtp.UploadFile(RemoteFile: PChar; NewFile: PChar): boolean;
    begin
               try
                           Result := true;
                           FTPMakeDirectory(NewFile);
                           if not FtpPutFile(FFtpHandle, RemoteFile, NewFile,
                                                               FTP_TRANSFER_TYPE_BINARY, 255) then
                           begin
                                       Result := false;
                           end;
               except
                           Result := false;
               end;
    end;

    //-------------------------------------------------------------------------
    // 下载文件
    function TWLFtp.DownloadFile(RemoteFile: PChar; NewFile: PChar): boolean;
    begin
               try
                           Result := true;
                           MakeDirectory(NewFile);
                           if not FtpGetFile(FFtpHandle, RemoteFile, NewFile,
                                                                                       True, FILE_ATTRIBUTE_NORMAL, FTP_TRANSFER_TYPE_BINARY OR INTERNET_FLAG_RELOAD, 255) then
                           begin
                                       Result := false;
                           end;
               except
                           Result := false;
               end;
    end;

    //-------------------------------------------------------------------------
    // 创建目录
    function TWLFtp.CreateDirectory(Directory: PChar): boolean;
    begin
               try
                           Result := true;
                           if FtpCreateDirectory(FFtpHandle, Directory)=false then
                           begin
                                       Result := false;
                           end;
               except
                           Result := false;
               end;
    end;

    //-------------------------------------------------------------------------
    // 目录数
    function TWLFtp.LayerNumber(dir: string): integer;
    var
               i: integer;
               flag: string;
    begin
               Result := 0;

               for i:=1 to Length(dir) do
               begin
                           flag := Copy(dir,i,1);
                           if (flag='\') or (flag='/') then
                           begin
                                       Result := Result + 1;
                           end;
               end;
    end;

    //-------------------------------------------------------------------------
    // 创建目录
    function TWLFtp.FTPMakeDirectory(dir: string): boolean;
    var
               count, i: integer;
               SubPath: string;
    begin
               Result := true;
               count := LayerNumber(dir);

               for i:=1 to count do
               begin
                           SubPath := IndexOfLayer(i, dir);
                           if CreateDirectory(PChar(CurrentDir+SubPath))=false then
                           begin
                                       Result := false;
                           end;
               end;
    end;

    //-------------------------------------------------------------------------
    // 创建目录
    function TWLFtp.MakeDirectory(dir: string): boolean;
    var
               count, i: integer;
               SubPath: string;
               str: string;
    begin
               Result := true;
               count := LayerNumber(dir);
               str := GetDirectory(dir);

               for i:=2 to count do
               begin
                           SubPath := IndexOfLayer(i, str);
                           if not DirectoryExists(SubPath) then
                           begin
                                       if not CreateDir(SubPath) then
                                       begin
                                                   Result := false;
                                       end;
                           end;
               end;
    end;

    //-------------------------------------------------------------------------
    // 获取index层的目录
    function TWLFtp.IndexOfLayer(index: integer; dir: string): string;
    var
               count, i: integer;
               ch: string;
    begin
               Result := '';
               count := 0;
               for i:=1 to Length(dir) do
               begin
                           ch := Copy(dir, i, 1);
                           if (ch='\') or (ch='/') then
                           begin
                                       count := count+1;
                           end;
                           if count=index then
                           begin
                                       break;
                           end;
                           Result := Result + ch;
               end;
    end;

    //-------------------------------------------------------------------------
    // 获取文件名
    function TWLFtp.GetFileName(FileName: string): string;
    begin
               Result := '';
               while (Copy(FileName, Length(FileName), 1)<>'\') and (Length(FileName)>0) do
               begin
                           Result := Copy(FileName, Length(FileName), 1)+Result;
                           Delete(FileName, Length(FileName), 1);
               end;
    end;

    //-------------------------------------------------------------------------
    // 获取目录
    function TWLFtp.GetDirectory(dir: string): string;
    begin
               Result := dir;
               while (Copy(Result, Length(Result), 1)<>'\') and (Length(Result)>0) do
               begin
                           Delete(Result, Length(Result), 1);
               end;

    {            if Copy(Result, Length), 1)='\' then
               begin
                           Delete(Result, 1, 1);
               end;}
    end;

    //-------------------------------------------------------------------------
    end.
  • 相关阅读:
    如何学习WindDbg
    如何在程序中嵌入google的V8 Javascript引擎
    理解程序内存
    如何学习Windows编程
    如何让窗口控件半透明
    Sessions, Window Stations and Desktops
    QQ截图时窗口自动识别的原理
    为什么设计模式在C++社区没有Java社区流行?
    当年写的俄罗斯方块
    如何判断一个C++对象是否在堆上
  • 原文地址:https://www.cnblogs.com/94YY/p/2043507.html
Copyright © 2011-2022 走看看