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.