Indy 9 FTP 安装

因为某些原因,很长时间都没有好好学习了,现在终于是有时间再看看代码了。
单位需要一个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、在ini文件中保存服务器地址、用户名、密码、FTP目的路径(反正是自己科室用,就没有加密字符串)
2、FTP目录不能更改,也就是说FTP只能进入指定的目录,不能进入其父目录、也不能进入其子目录
3、不能增加、删除FTP目录,可以下载、上传、删除FTP文件
4、下载文件时因为只是txt文件,不会太大,就不用断点续传了。上传时如有同名文件,直接覆盖。
现在将相关的代码粘贴如下,格式是用Delphi Formatter自动排列的(代码主要由Demo修改而来):
  1. procedure TForm1.Btn_ConnectClick(Sender: TObject);
  2. var
  3.   LS: TStringList;
  4.   ServerIni: TIniFile;
  5. begin
  6.   Btn_Connect.Enabled := false;
  7.   if IdFTP1.Connected then
  8.   try
  9.     IdFTP1.Quit;
  10.   finally
  11.     ListBox_Directory.Items.Clear;
  12.     Btn_Connect.Caption := 'Connect';
  13.     Btn_Connect.Enabled := true;
  14.     Btn_Connect.Default := true;
  15.   end
  16.   else
  17.   try
  18.     IdFTP1.Host := Edit_FtpServer.Text;
  19.     IdFTP1.Username := Edit_UserID.Text;
  20.     IdFTP1.Password := Edit_Password.Text;
  21.     IdFTP1.Connect;
  22.     LS := TStringList.Create;
  23.     try
  24.       IdFTP1.ChangeDir(Edit_CurrentDir.Text);
  25.       //procedure ChangeDir(const ADirName: string);
  26.       //该方法将FTP服务器上的当前目录改变到一个子目录,新的目录由ADirName参数指定
  27.       IdFTP1.TransferType := ftASCII;
  28.       //设置FTP的传输方式为文本方式
  29.       //ftBinary:传输可执行文件、压缩文件、图像文件及多媒体文件
  30.       //ftASCII: 传输文本文件、HTML文件
  31.       Edit_CurrentDir.Text := IdFTP1.RetrieveCurrentDir; //获得FTP服务器上的当前目录
  32.       ListBox_Directory.Items.Clear;
  33.       IdFTP1.List(LS);
  34.       //procedure List(ADest: TStrings; const ASpecifier: string; const ADetails: boolean);
  35.       //列出FTP服务器上当前目录中的文件和子目录,ADest参数用于保存列出信息,ASpecifier用于屏蔽列出的文件,ADetails列出由FTP服务器决定的详细信息
  36.       ListBox_Directory.Items.Assign(LS); //将信息赋值给ListBox_Directory进行显示
  37.     finally
  38.       LS.Free;
  39.     end;
  40.     ServerIni := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'FtpHost.ini');
  41.     ServerIni.WriteString('Server''FTPHOST', Edit_FtpServer.Text);
  42.     ServerIni.WriteString('Server''FTPUID', Edit_UserID.Text);
  43.     ServerIni.WriteString('Server''FTPPID', Edit_Password.Text);
  44.     ServerIni.Free;
  45.   finally
  46.     Btn_Connect.Enabled := true;
  47.     if IdFTP1.Connected then
  48.     begin
  49.       Btn_Connect.Caption := 'Disconnect';
  50.       Btn_Connect.Default := false;
  51.     end;
  52.   end;
  53. end;
  54. procedure TForm1.Btn_DownloadClick(Sender: TObject);
  55. var
  56.   Name: string;
  57. begin
  58.   if not IdFTP1.Connected then exit;
  59.   if ListBox_Directory.ItemIndex = -1 then
  60.   begin
  61.     ShowMessage('请选择一个需要下载的文件!');
  62.   end
  63.   else
  64.   begin
  65.     Name := IdFTP1.DirectoryListing.Items[ListBox_Directory.ItemIndex].FileName;
  66.     if IdFTP1.DirectoryListing.Items[ListBox_Directory.ItemIndex].ItemType = ditDirectory then
  67.     begin
  68.       ShowMessage('不能下载目录!');
  69.     end
  70.     else
  71.     begin
  72.       try
  73.         SaveDialog_Download.FileName := Name;
  74.         if SaveDialog_Download.Execute then
  75.         begin
  76.           IdFTP1.TransferType := ftASCII;
  77.           if FileExists(Name) then
  78.           begin
  79.             case MessageDlg('文件已经存在,覆盖吗?', mtConfirmation, [mbYes, mbNo], 0of
  80.               mrYes:
  81.                 begin
  82.                   IdFTP1.Get(Name, SaveDialog_Download.FileName, true);
  83.                 //procedure Get(const ASourceFile: string; ADest: TStream); overload;
  84.                 //procedure Get(const ASourceFile: string; const ADestFile: string; const ACanOverwrite: boolean); overload;
  85.                 //第三个参数为重写同名文件,第四个参数为是否进行断点续传
  86.                 end;
  87.               mrNo:
  88.                 begin
  89.                   exit;
  90.                 end;
  91.             end;
  92.           end;
  93.         end
  94.         else
  95.         begin
  96.           IdFTP1.Get(Name, SaveDialog_Download.FileName, false);
  97.         end;
  98.       finally
  99.       end;
  100.     end;
  101.   end;
  102. end;
  103. procedure TForm1.Btn_UploadClick(Sender: TObject);
  104. var
  105.   LS: TStringList;
  106. begin
  107.   if IdFTP1.Connected then
  108.   begin
  109.     if OpenDialog_Upload.Execute then
  110.     try
  111.       IdFTP1.TransferType := ftASCII;
  112.       IdFTP1.Put(OpenDialog_Upload.FileName, ExtractFileName(OpenDialog_Upload.FileName));
  113.       //procedure Put(const ASource: TStream; const ADestFile: string; const AAppend: boolean); overload;
  114.       //procedure Put(const ASourceFile: string; const ADestFile: string; const AAppend: boolean); overload;
  115.       //AAppend参数为True时,如果服务器上存在同名文件,则将上传文件添加在服务器上
  116.       ShowMessage(OpenDialog_Upload.FileName + '文件上传成功!');
  117.       LS := TStringList.Create;
  118.       try
  119.         IdFTP1.ChangeDir(IdFTP1.RetrieveCurrentDir);
  120.         IdFTP1.TransferType := ftASCII;
  121.         Edit_CurrentDir.Text := IdFTP1.RetrieveCurrentDir;
  122.         ListBox_Directory.Items.Clear;
  123.         IdFTP1.List(LS);
  124.         ListBox_Directory.Items.Assign(LS);
  125.       finally
  126.         LS.Free;
  127.       end;
  128.     finally
  129.     end;
  130.   end;
  131. end;
  132. procedure TForm1.FormCreate(Sender: TObject);
  133. var
  134.   ServerIni: TIniFile;
  135. begin
  136.   ServerIni := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'FtpHost.ini');
  137.   Edit_FtpServer.Text := ServerIni.ReadString('Server''FTPHOST''');
  138.   Edit_UserID.Text := ServerIni.ReadString('Server''FTPUID''');
  139.   Edit_Password.Text := ServerIni.ReadString('Server''FTPPID''');
  140.   Edit_CurrentDir.Text := ServerIni.ReadString('Directory''TRANPATH''');
  141.   ServerIni.Free;
  142.   Edit_CurrentDir.Enabled := false;//不允许更改FTP路径
  143. end;
  144. procedure TForm1.Btn_DeleteClick(Sender: TObject);
  145. var
  146.   Name: string;
  147.   LS: TStringList;
  148. begin
  149.   if not IdFTP1.Connected then exit;
  150.   Name := IdFTP1.DirectoryListing.Items[ListBox_Directory.ItemIndex].FileName;
  151.   if IdFTP1.DirectoryListing.Items[ListBox_Directory.ItemIndex].ItemType = ditDirectory then
  152.   try
  153.     ShowMessage('不能删除目录!');
  154.   finally
  155.   end
  156.   else
  157.   try
  158.     IdFTP1.Delete(Name);
  159.     ShowMessage(Name + '文件已删除!');
  160.     LS := TStringList.Create;
  161.     try
  162.       IdFTP1.ChangeDir(IdFTP1.RetrieveCurrentDir);
  163.       IdFTP1.TransferType := ftASCII;
  164.       Edit_CurrentDir.Text := IdFTP1.RetrieveCurrentDir;
  165.       ListBox_Directory.Items.Clear;
  166.       IdFTP1.List(LS);
  167.       ListBox_Directory.Items.Assign(LS);
  168.     finally
  169.       LS.Free;
  170.     end;
  171.   finally
  172.   end;
  173. end;
  174. end.

 

另外,Demo中用IdLogEvent截获Indy发送接收的数据信息,在这里没什么用,因此就没有放进去。

 

来自:http://blog.sina.com.cn/s/reader_4bd40031010007lk.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值