求教:关于NMFTP控件的文件拷贝操作。 (100分)

  • 主题发起人 主题发起人 silverwolf
  • 开始时间 开始时间
S

silverwolf

Unregistered / Unconfirmed
GUEST, unregistred user!
想通过NMFTP控件实现对某一远程主机上文件的拷贝和移动,该如何写?
希望有大侠告知,谢谢。
 
这个方法我是在Sybase数据库下实现的,不知道采用的是什么数据库,具体步骤如下:
① 在异地安装一台PC机,要求如下:
能够通过网络,利用TCP/IP协议访问到Unix主机;
安装Sybase Open Clent for Win95/win98。
② 建立一个配置文件。
该文件存放Unix主机的IP地址,Ftp的端口号,Unix的用户名及口令,数据
库备份文件存放的源、目的路径与名称,数据库所有需bcp的表名。文件名
为:dumpfile.ini,存放在c:/dump目录下,内容如下:
[Server Options]
Server IP Address=100.10.10.1
Server Port=21
User Name=root
User Password=root123
Ftp Source=/u/dumpfile.dat
Ftp Target=c:/dump/dumpfile.dat
[Bcp Tables]
t1=table1
t2=table2
例子中的table1,table2为testdb数据库中需要bcp的表。
③ 利用Delphi Clent/Server Suite V4.0编制一个程序,实现数据库备份文件的异地
自动拷贝和表的自动bcp。该程序利用了 Delphi 的Timer控件、NMFTP控件以及Win32 API
的进程创建函数CreateProcess。现对几个主要的程序片段逐一说明:
定时器过程。定时器Timer1的OnTimer事件调用该过程,它用来循环检测当前时间是
否为凌晨2点15分,若是就去调用自动拷贝过程(FtpProc)和自动bcp过程(BcpProc)。
procedure TForm1.Timer1Timer(Sender: TObject);
var Present: TDateTime;Hour, Min, Sec, MSec: Word;
begin Present:= Now;DecodeTime(Present, Hour, Min, Sec, MSec);
if ((Hour=2) and (Min=15) and (Sec=0)) then begin
FtpProc;BcpProc; end;
end;
l Ftp登录函数。该函数从c:/dump/dumpftp.ini中取出Unix主机的有关信息,进行Ftp登录。
function TForm1.ConnectServer: Boolean;
var IniFile : TIniFile;
begin IniFile := TIniFile.Create(INI_FILE);
NMFTP1.Host := IniFile.ReadString('Server Options','Server IP Address','');
NMFTP1.Port := IniFile.ReadInteger('Server Options','Server Port',21);
NMFTP1.UserID := IniFile.ReadString('Server Options','User Name','');
NMFTP1.Password :=IniFile.ReadString('Server Options','User Password','');
try NMFTP1.Connect; except begin
Result:=False;Application.MessageBox('连接务器失败!','错误',MB_OK);exit;
end; Result := True; IniFile.Free;
end;
l 拷贝备份文件的过程。该过程调用Ftp登录函数ConnectServer,进行Ftp登录,登录
成功后利用NMFTP控件的download方法进行拷贝,Unix主机相当于Ftp服务器,异地PC机
器相当于Ftp客户端。
procedure TForm1.FtpProc;
var IniFile : TIniFile;ftp_source,ftp_target,ftp_old: String;
begin IniFile := TIniFile.Create(INI_FILE);
ftp_source:= IniFile.ReadString('Server Options','Ftp Source','');
ftp_target:= IniFile.ReadString('Server Options','Ftp Target','');
if not ConnectServer then begin
Memo1.Lines.Add('★连接数据库服务器失败,中断!');IniFile.Free;exit;
end;
Memo1.Lines.Add('★开始拷贝数据库备份文件!'+ ftp_source + '->' + ftp_target);
NMFTP1.Mode(MODE_IMAGE);
try NMFTP1.download(PChar(ftp_source), PChar(ftp_target));
except Memo1.Lines.Add('***文件复制错误!***'); end;
Memo1.Lines.Add('★拷贝数据库备份文件完毕!'); NMFTP1.Disconnect;IniFile.Free;
end;
l 数据库表的bcp过程。该过程从c:/dump/dumpftp.ini中循环取出数据库需要bcp的表
名,利用Win32 API的进程创建函数CreateProcess,给Sybase Open Clinet for Win95/Win98
的bcp程序创建进程,实现bcp操作。
procedure TForm1.BcpProc;
var IniFile:TIniFile;str,str1:string; SI:TStartupInfo;PI:TProcessInformation;
p_status:boolean; section: TStringList;i: Integer;
begin Memo1.Lines.Add(''); Memo1.Lines.Add('★开始 Bcp Tables !');
IniFile:=TIniFile.Create(INI_FILE);section:=TStringList.Create;
IniFile.ReadSection('Bcp Tables',section);
for i :=0 to section.Count -1 do begin
FillChar(SI,SizeOf(SI),0);SI.cb:=SizeOf(SI);SI.dwFlags:=STARTF_USESHOWWINDOW;
str:=IniFile.ReadString('Bcp Tables',section,'');str:=section;
str1 :='bcp testdb..'+str+' out '+str+'.txt -c -Usa -P -SSYBASE';
p_status:=CreateProcess(nil,PChar(str1),nil,nil,True,0,nil,nil,SI,PI);
if not p_status then begin ShowMessage('★ bcp 失败!'); exit; end;
WaitForSingleObject(PI.hProcess,INFINITE);
CloseHandle(PI.hThread);CloseHandle(PI.hProcess);
Memo1.Lines.Add('★bcp tele114..'+str+' out '+str+'.txt 结束');
end; Memo1.Lines.Add('★结束 Bcp Tables!');
end;
④ 生成可执行文件dumpftp.exe。把用Delphi编制的程序编译生成exe文件,存放
在c:/dump目录下,并运行该程序。
至此,实现了Sybase数据库的自动备份、备份文件异地自动拷贝以及数据库表的自动bcp。
 
NMFtp1.DownLoad(.....);
 
谢谢诸位的帮忙,不过用Download,upload实在……,
我查了一下ftp的相关信息,好像没有等同的copy命令,
最后是从别人那偷了一头telnet的控件实现了。
 
后退
顶部