请问有没有idftp控件实现自动升级的源代码(50分)

  • 主题发起人 主题发起人 j810208
  • 开始时间 开始时间
J

j810208

Unregistered / Unconfirmed
GUEST, unregistred user!
请问一下,谁有用idftp实现自动升级的源代码,把ftp服务器上的生机的文件夹下所有的文件(包括子文件夹)复制到本机,覆盖原文件,请问谁能发一份给我!谢谢
jiang810208@126.com
 
看来对idftp有研究,我发的贴子,帮忙看看朋友,^_^
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2240552
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2100418
 
用idftp.list可以得到所有的文件名,怎么把这些文件保存到一个数组里,就是取一个文件
就传送,nmftp有一个例子,可是在2000下有问题,就是有demo内的都不行
 
用idftp怎么把文件夹下的所有文件显示出来包括子文件,我知道TSearchRec,不知怎么用,谁有份完整点的例子吗
 
修改了一下demo程序:
IdFTP1.ChangeDir(DirName);
IdFTP1.TransferType := ftASCII;
DirectoryListBox.Items.Clear;
IdFTP1.List(DirectoryListBox.Items, '*.*', false);//获得目录下的所有文件,显示在listbox中
showmessage(DirectoryListBox.Items.CommaText); //文件名称的一个string
这样想放在数组里也可以呀,把对应的listbox的值赋给数组就可以。

再者idftp显示文件夹下的文件和子文件夹可以,要是想一次把子文件夹下的文件也显示出来,我不知道,朋友知道后,可要告诉在下呀。
 
IdFTP1.List(DirectoryListBox.Items, '*.*', false)只能显示文件夹下所有的文件,不能显示子文件夹,假设我有一个文件夹,里面也只有一个文件夹,我读list大小时为0,就是文件夹的名称没读出来,把false改为true,就会多两个文件,文件夹名称可以读出,可是不知怎么判断是文件还是文件夹,请问你知道吗[:)]
 
procedure DeletesFtpFile(aIndyftp : TIDFTP; aDir : String);
var
File_list : TStringList;
i : integer;
begin
File_List := TStringList.Create;
if not InitServer(aIndyFtp) then exit;
aIndyFtp.ChangeDir(aDir);
//得到文件夹下的所有文件
aIndyFtp.List(File_List, '*.*', false);
for i := 0 to File_List.Count - 1 do
try
aIndyFtp.Delete(File_List.Strings);
except
File_List.Free;
exit;
end;
File_List.Free;
File_List := TStringList.Create;
//获得所有文件夹(因为此时文件已经删除)
aIndyFtp.List(File_List, '', false);
if File_List.Count = 0 then
begin
aIndyFtp.ChangeDir('/');
aIndyFtp.RemoveDir(aDir);
File_list.Free;
end
else
begin
for i := 0 to File_List.Count - 1 do
DeletesFtpFolder(aIndyftp, aDir);
File_list.Free;
end;
end;

procedure DeletesFtpFolder(aIndyftp : TIDFTP; aDir : String);
var
Folder_list : TStringList;
i : integer;
begin
//得到文件夹下的子文件夹
Folder_list := TStringList.Create;
if not InitServer(aIndyFtp) then exit;
aIndyFtp.ChangeDir(aDir);
aIndyFtp.List(Folder_list, '', false);
for i := 0 to Folder_list.Count - 1 do
try
DeletesFtpFile(aIndyFtp, aDir + Folder_list.Strings+ '/');
except
Folder_list.Free;
end;
end;
这是写的一个用于删除一个ftp目录的两个过程,还有问题。删除思路是先删除该文件夹下的所有文件,然后查找该文件夹下所有的子文件夹,然后再通过遍历所有文件夹删除下面的文件。目前存在问题是,目录层次多的话,只可以删除最底一层
 
这个方法不太好,最好不要删除文件,假设我系统崩溃,重装软件,那我怎么升级:)
谢谢你给我一条思路
 
把主机的文件复制的本地,好像是没有很直接的方法实现。我看可以通过,先把ftp服务器上第一级目录下的文件,先复制到你本地,第一级目录,然后再取ftp服务器上第一级子文件中的文件,一个一个遍历,当然,下载到本地时你要判断本地是否已经存在同名的文件夹,没有要创建,对应名称相同的文件,idftp会用新的文件代替旧文件的。
 
to manana
我现在用ftpserver写了一个服务器程序,用idftp时使用idftp.list(Folder_list, '*.*', false)时,得到的是所在目录所有的文件名和子文件夹名,这是怎么回事,还望你赐教!
 
哦,这样呀,我也不清楚,不过idftp.list的帮助中就是这么介绍的:
*.* - All files in the current directory.
* - All directory entries in the current directory.
*. - All files regardless of extension in the current directory.
A??.txt - All text files that have a 3-character name starting with 'A'.
你可以利用delphi的demo程序ftpdemo,测试一下list的第二个参数的值。代码197行
IdFTP1.List(DirectoryListBox),修改一下IdFTP1.List(DirectoryListBox,'*.*',false)看看效果。你说的情况,我这试了一下,没有出现,所以具体为何会这样,我也不太清楚。sorry
 
我给你服务端的代码
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, FtpSrv,FtpSrvC, WSocket,WinSock, Menus,shellapi;

ftpserver1.Addr:=LocalIP;
ftpserver1.Port:=inttostr(4331);
ftpserver1.MaxClients:=50;
try
ftpserver1.Start;
show.Caption:='连接成功! ';
except
showmessage('服务器不能启动,请检查! ');
show.Caption:='连接失败!';
end;
SetWindowLong(application.handle,gwl_exstyle,ws_ex_toolwindow);

end;
//检查用户名与密码是否正确 ,不正确结束客户端的连接
procedure TForm1.FtpServer1Authenticate(Sender: TObject;
Client: TFtpCtrlSocket; UserName, Password: TFtpString;
var Authenticated: Boolean);
var
homedir:string;
begin
if (USerName<>'guest') and (password<>'') then
begin
Client.Close;
Exit;
end;
//设置共享的主目录
homedir:=ExtractFilePath(Application.ExeName);
homedir:=homedir+'/update/';
if not DirectoryExists(HomeDir) then
begin
CreateDir(HomeDir);
end;
Client.HomeDir := HomeDir;

end;
//关闭服务器
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
try
FtpServer1.Stop;
show.Caption:='连接断开! ';
except
showmessage('不能断开连接! ');
end;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
try
ftpserver1.Start;
show.Caption:='连接成功! ';
except
showmessage('服务器不能启动,请检查! ');
show.Caption:='连接失败! ';
end;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
FtpServer1.Stop;
end;

procedure TForm1.FtpServer1ClientDisconnect(Sender: TObject;
Client: TFtpCtrlSocket; AError: Word);
begin
Client.Close;
end;

/////////////////////////////////////////// 取得本机的ip号
function TForm1.LocalIP : string;
var
phoste:PHostEnt;
Buffer:array[0..100] of char;
WSAData:TWSADATA;
begin
result:='';
if WSASTartup($0101, WSAData) <> 0 then exit;
GetHostName(Buffer,Sizeof(Buffer));
phoste:=GetHostByName(buffer);
if phoste = nil then
begin
result:='127.0.0.1';
end
else
result:=StrPas(inet_ntoa(PInAddr(phoste^.h_addr_list^)^));
WSACleanup;
end;
如果你运行这个服务端的代码,看看出现的情况和我的是不是一样,如果程序中有什么问题,还请指出
 
IdFTP1.List(DirectoryListBox,'*.*',false)好象不行,我用的是delphi6,第一个参数要是tstringlist类型,而这是tlistbox类型,运行出错,你写过ftp服务器的程序吗,对我上面的代码请多多指教
 
子文件夹下的文件也显示出来用递归,是子文件夹就递归
 
多人接受答案了。
 
后退
顶部