用TlistView 显示TIdFtp 目录列表

在使用idftp组件的时候,目录列表的显示,是个比较大的问题,在indy9的demo中,使用的是headercontrol+listbox,然后处理listbox的drawitem事件,看起来,也不简单。

由于indy10的demo少得可怜,特说明如下:其中,indy10,listview使用的是raize component 5的控件,跟标准控件可能有部分差异。

方法:

首先,在连接上服务器后,调用idftp的list函数,获取文件列表

其中,list的函数,

procedure List( ADest: TIdStrings, const ASpecifier: string = ”, ADetails: Boolean = True ); overload;

可以根据简单的表达式过滤,如下,就只显示出zip文件,AFiles存储了文件列表

AFiles := TIdStringList.Create;
AFtp.List(AFiles, ‘*.zip’, True);
if AFtp.DirectoryListing.Count <> 0 then
begin
   FillDirListView(AFtp.DirectoryListing)
end;

其实,idftp的ListResult属性也保存了相应的列表,完全可以忽略list函数中的该参数

 

然后,根据idftp的DirectoryListings 属性,把相应的文件添加到listview中,

其中DirectoryListings属性是上面的ListResult的格式化结果,可以很方便的从中获取到一个文件或目录的相应属性,如文件名,大小,权限等。

该操作可以在idftp的OnRetrievedDir事件中进行处理,示例代码如下:同时获取当前目录,目录和文件以不同的图标显示

procedure TForm1.IdFTP1RetrievedDir(Sender: TObject);
var
  j: Integer;
  ListItem: TListItem;
begin
  RzComboBox1.Text := IdFTP1.RetrieveCurrentDir;
  for j := 1 to IdFTP1.ListResult.Count - 1 do
  begin
    with IdFTP1.DirectoryListing.Items[j] do
    begin
      ListItem := RzListView1.Items.Add;
      with ListItem do
      begin
        Caption := FileName;
//              SubItems.Add(LocalFileName);
        SubItems.Add(datetimetostr(ModifiedDate));
        SubItems.Add(IntToStr(Size));
        SubItems.Add(PermissionDisplay);
        ImageIndex := ifthen(ItemType = ditDirectory, 10, 12);
      end;
    end;
  end;
end;

 

当前,还要处理一下listview的headercolumn

显示效果:

image

注意:在indy10中,默认情况下,获取的DirectoryListings是空的,原因参见:TIdFTP的DirectoryListing使用问题

就是说,如果要解析Windows和unix服务器的文件格式的话,需要添加引用IdFTPListParseUnix,IdFTPListParseWindowsNT,这样,不需要做什么工作,就可以正确获取DirectoryListings属性了。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据