TIdFTP.List和返回值容器

http://blog.sina.com.cn/s/blog_4c0aa7ef01000921.html

 

List和结果容器

List(ADest: TStrings; const ASpecifier: string = ''; const ADetails: boolean = true);

描述:用于获得FTP服务器当前目录下的文件或目录列表。ADest是存贮FTP服务器目录列表返回的原始文本值的TStringList参数。ASpecifier是容纳列表中文件和/或目录掩盖符的String,可包含通配符。其中有些:

l    *.* 所有文件

l    * 所有目录条目

l    *. 忽略扩展名的所有文件

l    A??.txt以A开头的3字符名字的文本文档

ADetail是布尔值,表示list是否包含ASpecifier中掩码匹配的文件或目录的细节。False,使用FTP的NLST命令返回的文件或目 录名,True,List返回依FTP服务器不同的细节,包括文件大小,被修改的数据,对用户、组的文件许可,使用FTP的List命令。

List将初始化、清空DirectoryListing属性,将 ADest中的返回值解析到DirectoryListing容器的collection items中。当ADest为空,格式化的DirectoryListing为空。List将 FTP服务器的返回值存储在ListResult中,并且允许用List命令,独立使用或者准备构造DirectoryListing。

List调用DirectoryListing中的命令,检查FTP服务器返回的普通数据格式。应用程序可以不考虑默认检查,和通过在OnCheckListFormat and OnParseCustomListFormat事件句柄中添加程序实现的解析行为。

ListResult

只读TStrings属性,用于存储List函数的返回值。也可在当试图为DirectoryListin中创建的items决定列表格式时使用。ListResult在Create构造函数中初始化,在Destoy函数中释放。

DirectoryListing

property DirectoryListing: TIdFTPListItems ;

只读TIdFTPList属性,代表TIdFTPListItem实例(List和Status函数返回值)的容器和解析器。DiractoryListing总是在List和Status添加返回值之前被清空。

DiractoryListing提供一个结构化的方式,来访问FTP List,NLST,STAT命令返回的文件、目录的数据。DiractoryListing也可以用于装载显示FTP操作结果的GUI控制,如TTreeView。

DiractoryListing可以和OnParseCustumListFormat事件配合,来解析TIdFTPList不常规支持的FTP List格式。

DiractoryListing在使用List、或OnCreateFTPList事件句柄前初始化。DiractoryListing使用Destroy释放。

TIdFTPListItems

封装FTP目录列表的collection。

TIdFTPListItems = class (TCollection)

TIdFTPListItems.DirectoryName

公共字符串属性,表示collection中条目表示的文件系统目录的名字。使用Items访问目录列表的条目。修改DirectoryName将清空条目。

TIdFTPListItems.Items

TIdFTPItem通常由TIdFTP.LoadList函数创建。

TIdFTPListItems.ListFormat

是TIdFTPListFormat属性,在TIdFTP.LoadList解析中使用的目录格式。ListFormat用在Parse函数,决定适合 collection中目录条目的解析机制。通常容纳TIdFTP.CheckListFormat函数的返回值。默认值为福利房Unix,在 Create构造函数中被指派。

TIdFTPListItems函数

 Add

 CheckListFormat :CheckListFormat<->ListFormat(TIdFTPListFormat)

 Create

 IndexOf

 LoadList :  ListFormat下TStrings->TIdFTPItem,包括创建TIdFTPItem,还有调用Parse

 Parse :procedure Parse(ListFormat: TIdFTPListFormat; AItem: TIdFTPListItem); ListFormat下解析的数据在放在AItem.Data中。

 ParseCustom :激活事件OnParseCustomListFormat。该事件提供常规解析代码。当开发者需要支持非常规目录列表格式时用到它。若没有该事件,抛出异常EIdInvalidFTPListing

Format。

 ParseUnknown:抛出异常EIdInvalidFTPListingFormat。ListFormat为flfUnknown时,该函数被调用。

TIdFTPListItems

 OnGetCustomListFormat

 OnParseCustomListFormat

TIdFTPListItem

一个目录条目实现。TIdFTPListItem = class (TCollectionItem)

FTP服务器LIST,NLST,STAT命令的返回数据的普通表示。注意:FTP协议没有指定这种数据类型的标准表示。它实现大多数FTP服务器中建立 的普通参数。也提供用作目录条目基础的原始文本数据,和TIdFTPListItems容器的解析函数配合,跨越默认的解析行为。

 

TIdFTPListItem

 Data

 FileName

 GroupName

 GroupPermissions

 ItemCount

 ItemType

 LinkedItemName

 ModifiedDate

 OwnerName

 OwnerPermissions

 Size

 UserPermissions

TIdFTPListItem

 Assign

 Create

 Text

### 关于 `idFTP.List` 方法报错的解决方案 在 Delphi 中使用 Indy 组件库中的 `TIdFTP` 类时,如果调用 `List` 方法引发了错误,则可能是由于以下几个原因引起的: #### 1. **传输模式设置不当** 如果未正确配置 FTP 的传输模式(主动模式或被动模式),可能会导致连接失败并抛出异常。可以通过显式指定传输模式来解决问题。 ```delphi IdFTP.Passive := True; { 或 False } ``` 此外,在某些情况下可能还需要启用特定选项以支持更复杂的场景[^1]。 #### 2. **缺少必要的单元声明** 当编译器提示无法识别某些属性或方法时,通常是因为项目中缺失了必需的单元引用。例如,当尝试访问 `TransferType` 属性而遇到问题时,应确保已在项目的 uses 子句中包含了 `IdFTPCommon` 单元[^2]。 修改后的代码如下所示: ```delphi uses IdFTP, IdFTPCommon; ``` #### 3. **目标路径不存在或者权限不足** 调用 `List` 方法时传入的目标目录路径若不存在或将触发运行期错误。因此建议先验证远程服务器上的相应位置是否存在以及当前登录账户是否有足够的读取权限再执行操作。 可通过以下方式检查路径有效性: ```delphi if not IdFTP.DirectoryExists(RemotePath) then begin ShowMessage('The specified directory does not exist.'); Exit; end; ``` #### 4. **网络超时或其他通信障碍** 网络条件不佳也可能造成命令未能成功完成从而返回错误消息。适当调整时间参数有助于缓解这类状况的发生几率。 设置合理的超时时限可以这样写: ```delphi IdFTP.ReadTimeout := 5000; // 设定为五秒 ``` 以下是综合上述要点的一个完整示例程序片段用于展示如何安全地运用 `List` 函数获取远端文件列表信息而不易发生崩溃现象: ```delphi procedure TForm1.Button1Click(Sender: TObject); var ListStrings : TStringList; begin try with IdFTP do begin Host := 'yourserver.com'; Username := 'username'; Password := 'password'; Port := 21; Passive := True; ReadTimeout := 5000; Connect(True); ChangeDir('/public_html'); ListStrings := TStringList.Create; try List(ListStrings, '', False); // 获取非详细版面布局形式的结果集 Memo1.Lines.Assign(ListStrings); finally FreeAndNil(ListStrings); end; end; except on E: Exception do ShowMessage(E.Message); end; end; ``` 以上脚本实现了基本功能的同时还加入了简单的异常处理机制以便更好地应对潜在的风险因素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值