您的位置:首页 > 编程语言 > PHP开发

封装Ftp API函数,实现上传,下载文件,创建目录

2015-04-23 09:23 387 查看
//-------------------------------------------------------------------------
//  文件名:WLFtp.pas
//  描述:封装Ftp  API函数,实现上传,下载文件,创建目录
//
//  类名:TWLFtp
//  作者:Win  Lai
//  创建日期:2004-1-9
//  修改日期:2004-1-11
//-------------------------------------------------------------------------
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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐