因为某些原因,很长时间都没有好好学习了,现在终于是有时间再看看代码了。
单位需要一个FTP上传的程序,信息公司可以做,但……说来话长,就不扁他们了。求人不如求己,我看了看,用INDY最方便,而且在网络方面,它应该是Delphi中最有名的了。近来又没什么事,就研究了一下它的Demo,还好,不难。
但北京首都集团那边(FTP服务器放在那里)要求非常严格:
1、绝对不能更改FTP服务器的目录结构
2、指定上传的目录
3、上传的文件为txt文本文件
其实限制越多,我觉得程序写起来就越方便。
单位需要一个FTP上传的程序,信息公司可以做,但……说来话长,就不扁他们了。求人不如求己,我看了看,用INDY最方便,而且在网络方面,它应该是Delphi中最有名的了。近来又没什么事,就研究了一下它的Demo,还好,不难。
但北京首都集团那边(FTP服务器放在那里)要求非常严格:
1、绝对不能更改FTP服务器的目录结构
2、指定上传的目录
3、上传的文件为txt文本文件
其实限制越多,我觉得程序写起来就越方便。
我安装的是Indy_9_00_17,但我在网上搜索了一下,没有写的很清楚的教程(可能是我理解能力太差),因此我整理了一下INDY的卸载、安装步骤,如下(以Delphi6为例,它里面自带的是Indy 8,我们来安装Indy 9。此步骤在windows 2000 server 和 xp professional 下通过):
卸载:
1、进入Delphi安装目录(经常玩破解游戏的看到这句话应该觉得很眼熟吧:-))
2、执行Borland Delphi 6.msi--->Next--->Modify
3、Program Files-->Indy->Do Not Install 卸载Indy组件
安装:
4、将下载回来的Indy压缩包解压缩至一个临时目录Temp中,这样,Temp目录中就有了Indy_9_00_17_src子目录,执行其中的Fulld6.bat,然后你会发现在其上级目录(即Temp中)多了一个D6目录
5、执行Indy_9_00_17_src下的SetEnv.bat设置环境配置信息
6、打开Delphi6--->Component--->Install Packages--->Add……--->选择D6目录下的dclIndy60.bpl--->ok
7、再回到Delphi6时,你就会看到组件面板中多了几个组件群面板了。
8、如果想安装Indy的帮助,其实跟Ehlib的帮助一样的装法,可以去CSDN或Delphibbs上看看,有两篇关于Ehlib非常不错的文章,就不多说废话了。
卸载:
1、进入Delphi安装目录(经常玩破解游戏的看到这句话应该觉得很眼熟吧:-))
2、执行Borland Delphi 6.msi--->Next--->Modify
3、Program Files-->Indy->Do Not Install 卸载Indy组件
安装:
4、将下载回来的Indy压缩包解压缩至一个临时目录Temp中,这样,Temp目录中就有了Indy_9_00_17_src子目录,执行其中的Fulld6.bat,然后你会发现在其上级目录(即Temp中)多了一个D6目录
5、执行Indy_9_00_17_src下的SetEnv.bat设置环境配置信息
6、打开Delphi6--->Component--->Install Packages--->Add……--->选择D6目录下的dclIndy60.bpl--->ok
7、再回到Delphi6时,你就会看到组件面板中多了几个组件群面板了。
8、如果想安装Indy的帮助,其实跟Ehlib的帮助一样的装法,可以去CSDN或Delphibbs上看看,有两篇关于Ehlib非常不错的文章,就不多说废话了。
我考虑了一下,要注意这么几点:
1、在ini文件中保存服务器地址、用户名、密码、FTP目的路径(反正是自己科室用,就没有加密字符串)
2、FTP目录不能更改,也就是说FTP只能进入指定的目录,不能进入其父目录、也不能进入其子目录
3、不能增加、删除FTP目录,可以下载、上传、删除FTP文件
4、下载文件时因为只是txt文件,不会太大,就不用断点续传了。上传时如有同名文件,直接覆盖。
现在将相关的代码粘贴如下,格式是用Delphi Formatter自动排列的(代码主要由Demo修改而来):
- procedure TForm1.Btn_ConnectClick(Sender: TObject);
- var
- LS: TStringList;
- ServerIni: TIniFile;
- begin
- Btn_Connect.Enabled := false;
- if IdFTP1.Connected then
- try
- IdFTP1.Quit;
- finally
- ListBox_Directory.Items.Clear;
- Btn_Connect.Caption := 'Connect';
- Btn_Connect.Enabled := true;
- Btn_Connect.Default := true;
- end
- else
- try
- IdFTP1.Host := Edit_FtpServer.Text;
- IdFTP1.Username := Edit_UserID.Text;
- IdFTP1.Password := Edit_Password.Text;
- IdFTP1.Connect;
- LS := TStringList.Create;
- try
- IdFTP1.ChangeDir(Edit_CurrentDir.Text);
- //procedure ChangeDir(const ADirName: string);
- //该方法将FTP服务器上的当前目录改变到一个子目录,新的目录由ADirName参数指定
- IdFTP1.TransferType := ftASCII;
- //设置FTP的传输方式为文本方式
- //ftBinary:传输可执行文件、压缩文件、图像文件及多媒体文件
- //ftASCII: 传输文本文件、HTML文件
- Edit_CurrentDir.Text := IdFTP1.RetrieveCurrentDir; //获得FTP服务器上的当前目录
- ListBox_Directory.Items.Clear;
- IdFTP1.List(LS);
- //procedure List(ADest: TStrings; const ASpecifier: string; const ADetails: boolean);
- //列出FTP服务器上当前目录中的文件和子目录,ADest参数用于保存列出信息,ASpecifier用于屏蔽列出的文件,ADetails列出由FTP服务器决定的详细信息
- ListBox_Directory.Items.Assign(LS); //将信息赋值给ListBox_Directory进行显示
- finally
- LS.Free;
- end;
- ServerIni := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'FtpHost.ini');
- ServerIni.WriteString('Server', 'FTPHOST', Edit_FtpServer.Text);
- ServerIni.WriteString('Server', 'FTPUID', Edit_UserID.Text);
- ServerIni.WriteString('Server', 'FTPPID', Edit_Password.Text);
- ServerIni.Free;
- finally
- Btn_Connect.Enabled := true;
- if IdFTP1.Connected then
- begin
- Btn_Connect.Caption := 'Disconnect';
- Btn_Connect.Default := false;
- end;
- end;
- end;
- procedure TForm1.Btn_DownloadClick(Sender: TObject);
- var
- Name: string;
- begin
- if not IdFTP1.Connected then exit;
- if ListBox_Directory.ItemIndex = -1 then
- begin
- ShowMessage('请选择一个需要下载的文件!');
- end
- else
- begin
- Name := IdFTP1.DirectoryListing.Items[ListBox_Directory.ItemIndex].FileName;
- if IdFTP1.DirectoryListing.Items[ListBox_Directory.ItemIndex].ItemType = ditDirectory then
- begin
- ShowMessage('不能下载目录!');
- end
- else
- begin
- try
- SaveDialog_Download.FileName := Name;
- if SaveDialog_Download.Execute then
- begin
- IdFTP1.TransferType := ftASCII;
- if FileExists(Name) then
- begin
- case MessageDlg('文件已经存在,覆盖吗?', mtConfirmation, [mbYes, mbNo], 0) of
- mrYes:
- begin
- IdFTP1.Get(Name, SaveDialog_Download.FileName, true);
- //procedure Get(const ASourceFile: string; ADest: TStream); overload;
- //procedure Get(const ASourceFile: string; const ADestFile: string; const ACanOverwrite: boolean); overload;
- //第三个参数为重写同名文件,第四个参数为是否进行断点续传
- end;
- mrNo:
- begin
- exit;
- end;
- end;
- end;
- end
- else
- begin
- IdFTP1.Get(Name, SaveDialog_Download.FileName, false);
- end;
- finally
- end;
- end;
- end;
- end;
- procedure TForm1.Btn_UploadClick(Sender: TObject);
- var
- LS: TStringList;
- begin
- if IdFTP1.Connected then
- begin
- if OpenDialog_Upload.Execute then
- try
- IdFTP1.TransferType := ftASCII;
- IdFTP1.Put(OpenDialog_Upload.FileName, ExtractFileName(OpenDialog_Upload.FileName));
- //procedure Put(const ASource: TStream; const ADestFile: string; const AAppend: boolean); overload;
- //procedure Put(const ASourceFile: string; const ADestFile: string; const AAppend: boolean); overload;
- //AAppend参数为True时,如果服务器上存在同名文件,则将上传文件添加在服务器上
- ShowMessage(OpenDialog_Upload.FileName + '文件上传成功!');
- LS := TStringList.Create;
- try
- IdFTP1.ChangeDir(IdFTP1.RetrieveCurrentDir);
- IdFTP1.TransferType := ftASCII;
- Edit_CurrentDir.Text := IdFTP1.RetrieveCurrentDir;
- ListBox_Directory.Items.Clear;
- IdFTP1.List(LS);
- ListBox_Directory.Items.Assign(LS);
- finally
- LS.Free;
- end;
- finally
- end;
- end;
- end;
- procedure TForm1.FormCreate(Sender: TObject);
- var
- ServerIni: TIniFile;
- begin
- ServerIni := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'FtpHost.ini');
- Edit_FtpServer.Text := ServerIni.ReadString('Server', 'FTPHOST', '');
- Edit_UserID.Text := ServerIni.ReadString('Server', 'FTPUID', '');
- Edit_Password.Text := ServerIni.ReadString('Server', 'FTPPID', '');
- Edit_CurrentDir.Text := ServerIni.ReadString('Directory', 'TRANPATH', '');
- ServerIni.Free;
- Edit_CurrentDir.Enabled := false;//不允许更改FTP路径
- end;
- procedure TForm1.Btn_DeleteClick(Sender: TObject);
- var
- Name: string;
- LS: TStringList;
- begin
- if not IdFTP1.Connected then exit;
- Name := IdFTP1.DirectoryListing.Items[ListBox_Directory.ItemIndex].FileName;
- if IdFTP1.DirectoryListing.Items[ListBox_Directory.ItemIndex].ItemType = ditDirectory then
- try
- ShowMessage('不能删除目录!');
- finally
- end
- else
- try
- IdFTP1.Delete(Name);
- ShowMessage(Name + '文件已删除!');
- LS := TStringList.Create;
- try
- IdFTP1.ChangeDir(IdFTP1.RetrieveCurrentDir);
- IdFTP1.TransferType := ftASCII;
- Edit_CurrentDir.Text := IdFTP1.RetrieveCurrentDir;
- ListBox_Directory.Items.Clear;
- IdFTP1.List(LS);
- ListBox_Directory.Items.Assign(LS);
- finally
- LS.Free;
- end;
- finally
- end;
- end;
- end.
另外,Demo中用IdLogEvent截获Indy发送接收的数据信息,在这里没什么用,因此就没有放进去。
来自:http://blog.sina.com.cn/s/reader_4bd40031010007lk.html