用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 显示效果:
注意:在indy10中,默认情况下,获取的DirectoryListings是空的,原因参见:TIdFTP的DirectoryListing使用问题
就是说,如果要解析Windows和unix服务器的文件格式的话,需要添加引用IdFTPListParseUnix,IdFTPListParseWindowsNT,这样,不需要做什么工作,就可以正确获取DirectoryListings属性了。
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。