# Object - FTP 文件传输 ## `FTP` 声明:class 用于连接和登录 FTP 服务器,并管理远程目录、传输文件及发送服务器命令 下列范例使用本机 `127.0.0.1:42121` 的临时 FTP 测试服务 测试账号为 `tsl_user` 和 `tsl_pass`,测试结束后应清空服务根目录 ### `create()` 声明:function 无参数构造函数。创建 FTP 实例,连接参数由实例属性设置 可见性:public ### `create(host)` 声明:function 构造函数。按 host 配置名称读取连接参数并自动连接和登录服务器 可见性:public | 参数 | 类型 | 说明 | | ------ | ------ | ---------------------------------------------------------------- | | `host` | string | FTP 配置名称。指定后从配置文件读取连接参数并自动连接和登录服务器 | ### `abort()` 声明:function 终止连接 可见性:public 返回:any #### 示例 ```tsl obj := new FTP(); obj.host := "127.0.0.1"; obj.port := 42121; obj.username := "tsl_user"; obj.password := "tsl_pass"; obj.passive := true; obj.connect(); obj.login(); echo obj.abort(), "\n"; // 输出:0 ``` ### `changeDir(a_dir_name)` 声明:function 改变FTP服务器上的当前目录 可见性:public | 参数 | 类型 | 说明 | | ------------ | ------ | ---------------------------------- | | `a_dir_name` | string | string,字符串类型,要切换到的目录 | 返回:any #### 示例 ```tsl obj := new FTP(); obj.host := "127.0.0.1"; obj.port := 42121; obj.username := "tsl_user"; obj.password := "tsl_pass"; obj.passive := true; obj.connect(); obj.login(); obj.makeDir("tsl-change-dir"); echo obj.changeDir("tsl-change-dir"), "\n"; echo obj.retrieveCurrentDir, "\n"; obj.changeDirUp(); obj.removeDir("tsl-change-dir"); obj.abort(); // 输出: // 0 // /tsl-change-dir/ ``` ### `changeDirUp()` 声明:function 切换到FTP服务器上当前目录的父目录 可见性:public 返回:any #### 示例 ```tsl obj := new FTP(); obj.host := "127.0.0.1"; obj.port := 42121; obj.username := "tsl_user"; obj.password := "tsl_pass"; obj.passive := true; obj.connect(); obj.login(); obj.makeDir("tsl-change-dir-up"); obj.changeDir("tsl-change-dir-up"); echo obj.changeDirUp(), "\n"; echo obj.retrieveCurrentDir, "\n"; obj.removeDir("tsl-change-dir-up"); obj.abort(); // 输出: // 0 // / ``` ### `connect()` 声明:function 打开FTP连接 可见性:public 返回:any #### 示例 ```tsl obj := new FTP(); obj.host := "127.0.0.1"; obj.port := 42121; obj.username := "tsl_user"; obj.password := "tsl_pass"; obj.passive := true; echo obj.connect(), "\n"; obj.abort(); // 输出:0 ``` ### `crc(file_name, start_point, end_point)` 声明:function 计算FTP服务器上指定文件的CRC值。需要FTP服务器支持XCRC功能 可见性:public | 参数 | 类型 | 说明 | | ------------- | ------ | ------------------------------------------------------------------------------- | | `file_name` | string | 字符串类型,指定的文件名 | | `start_point` | int64 | 整数类型,计算CRC值的文件其实位置,默认为0 | | `end_point` | int64 | 整数类型,计算CRC值的文件末尾位置,默认为0,当指定为0时,EndPoint认为是文件长度 | 返回:int64 ### `delete(file_name)` 声明:function 删除FTP服务器上的文件 可见性:public | 参数 | 类型 | 说明 | | ----------- | ------ | ---------------------------------- | | `file_name` | string | 字符串类型,指定要删除的文件的名称 | 返回:any #### 示例 ```tsl filename := "/data/workspace/tmp/tsl-ftp-delete.txt"; pos := 0; writeFile(rwRaw(), "", filename, pos, 5, "hello"); source := new TMemoryStream(); source.loadFromFile("", filename); source.position := 0; obj := new FTP(); obj.host := "127.0.0.1"; obj.port := 42121; obj.username := "tsl_user"; obj.password := "tsl_pass"; obj.passive := true; obj.connect(); obj.login(); obj.put(source, "tsl-ftp-delete.txt", false); echo obj.delete("tsl-ftp-delete.txt"), "\n"; obj.abort(); fileDelete("", filename); // 输出:0 ``` ### `disconnectNotifyPeer()` 声明:function 断开并且通知服务器 可见性:public 返回:any ### `fileDate(file_name, s_gmt)` 声明:function 获取FTP服务器上文件的修改时间 可见性:public | 参数 | 类型 | 说明 | | ----------- | ------- | -------------------------------------------------- | | `file_name` | string | 字符串类型,指定要获得修改时间的文件的名称 | | `s_gmt` | boolean | 布尔类型,指定返回的时间是否为格林尼治时间标准时间 | 返回:datetime #### 示例 ```tsl filename := "/data/workspace/tmp/tsl-ftp-date.txt"; pos := 0; writeFile(rwRaw(), "", filename, pos, 5, "hello"); source := new TMemoryStream(); source.loadFromFile("", filename); source.position := 0; obj := new FTP(); obj.host := "127.0.0.1"; obj.port := 42121; obj.username := "tsl_user"; obj.password := "tsl_pass"; obj.passive := true; obj.connect(); obj.login(); obj.put(source, "tsl-ftp-date.txt", false); echo obj.fileDate("tsl-ftp-date.txt", false) > 0, "\n"; obj.delete("tsl-ftp-date.txt"); obj.abort(); fileDelete("", filename); // 输出:1 ``` ### `get(source_file, dest, resume)` 声明:function 获取从FTP服务器上下载文件 可见性:public | 参数 | 类型 | 说明 | | ------------- | ------- | ------------------------------------------------------- | | `source_file` | string | 执行FTP上要下载的源文件名称 | | `dest` | TSLObj | TStream类型,下载文件的目标流对象。参考 TFileStream对象 | | `resume` | boolean | 当设置为真实支持断点续传,否则重新下载文件 | 返回:any #### 示例 ```tsl source_file := "/data/workspace/tmp/tsl-ftp-get-source.txt"; dest_file := "/data/workspace/tmp/tsl-ftp-get-dest.txt"; pos := 0; writeFile(rwRaw(), "", source_file, pos, 5, "hello"); source := new TMemoryStream(); source.loadFromFile("", source_file); source.position := 0; obj := new FTP(); obj.host := "127.0.0.1"; obj.port := 42121; obj.username := "tsl_user"; obj.password := "tsl_pass"; obj.passive := true; obj.connect(); obj.login(); obj.put(source, "tsl-ftp-get.txt", false); dest := new TMemoryStream(); echo obj.get("tsl-ftp-get.txt", dest, false), "\n"; dest.position := 0; dest.saveToFile("", dest_file); obj.delete("tsl-ftp-get.txt"); obj.abort(); echo fileExists("", dest_file), "\n"; fileDelete("", source_file); fileDelete("", dest_file); // 输出: // 0 // 1 ``` ### `help(help_contents, command)` 声明:function 获取FTP服务器命令以及其他帮助信息,使用FTP的HELP命令。必须在登陆连接后才可以使用Help函数 可见性:public | 参数 | 类型 | 说明 | | --------------- | ----------- | ----------------------------------------------------------- | | `help_contents` | TStringList | 字符串类型,用于返回服务器的执行状态信息 | | `command` | string | 可选。字符串类型,用于请求具体的命令的帮助信息,如HELP SITE | 返回:any ### `isServerMDTZAndListTForm()` 声明:function 指出FTP服务器是否支持FTP MDTM和LIST-T 命令 可见性:public 返回:boolean ### `list(dest, specifier, details)` 声明:function 列出 FTP 服务器当前目录中匹配 specifier 的文件或目录 可见性:public | 参数 | 类型 | 说明 | | ----------- | ----------- | -------------------------------------------------- | | `dest` | TStringList | 接收文件或目录列表的字符串列表 | | `specifier` | string | 当前目录下的目录名称、文件名或通配符,例如 `*.txt` | | `details` | boolean | 是否返回包含大小、修改时间和权限等信息的详细列表 | 返回:any #### 示例 ```tsl filename := "/data/workspace/tmp/tsl-ftp-list.txt"; pos := 0; writeFile(rwRaw(), "", filename, pos, 5, "hello"); source := new TMemoryStream(); source.loadFromFile("", filename); source.position := 0; obj := new FTP(); obj.host := "127.0.0.1"; obj.port := 42121; obj.username := "tsl_user"; obj.password := "tsl_pass"; obj.passive := true; obj.connect(); obj.login(); obj.put(source, "tsl-ftp-list.txt", false); files := new TStringList(); obj.list(files, "*.txt", true); echo files.count > 0, "\n"; obj.delete("tsl-ftp-list.txt"); obj.abort(); fileDelete("", filename); // 输出:1 ``` ### `login()` 声明:function 提供FTP连接的验证,此前必须制定Username和Password属性 可见性:public 返回:any #### 示例 ```tsl obj := new FTP(); obj.host := "127.0.0.1"; obj.port := 42121; obj.username := "tsl_user"; obj.password := "tsl_pass"; obj.passive := true; obj.connect(); echo obj.login(), "\n"; echo obj.retrieveCurrentDir, "\n"; obj.abort(); // 输出: // 0 // / ``` ### `makeDir(dir_name)` 声明:function 在FTP服务器上创建目录 可见性:public | 参数 | 类型 | 说明 | | ---------- | ------ | ---------------------------- | | `dir_name` | string | 字符串类型,要创建的目录名称 | 返回:any #### 示例 ```tsl obj := new FTP(); obj.host := "127.0.0.1"; obj.port := 42121; obj.username := "tsl_user"; obj.password := "tsl_pass"; obj.passive := true; obj.connect(); obj.login(); echo obj.makeDir("tsl-make-dir"), "\n"; obj.removeDir("tsl-make-dir"); obj.abort(); // 输出:0 ``` ### `noop()` 声明:function 向FTP服务器发送一个KEEP-ALIVE信号。服务器在长时间处于空闲状态下,使用NOOP方法可以防止服务器关闭连接 可见性:public 返回:any ### `put(source, dest_file, append)` 声明:function 上传文件到FTP服务器 可见性:public | 参数 | 类型 | 说明 | | ----------- | ------- | ---------------------------------------------------------- | | `source` | TStream | 流对象类型,包含要上传的数据 | | `dest_file` | string | 字符串类型,远程服务器的目标文件名 | | `append` | boolean | 布尔类型,为真时,服务器将上传到数据从已存在的文件末尾写入 | 返回:any #### 示例 ```tsl filename := "/data/workspace/tmp/tsl-ftp-put.txt"; pos := 0; writeFile(rwRaw(), "", filename, pos, 5, "hello"); source := new TMemoryStream(); source.loadFromFile("", filename); source.position := 0; obj := new FTP(); obj.host := "127.0.0.1"; obj.port := 42121; obj.username := "tsl_user"; obj.password := "tsl_pass"; obj.passive := true; obj.connect(); obj.login(); echo obj.put(source, "tsl-ftp-put.txt", false), "\n"; obj.delete("tsl-ftp-put.txt"); obj.abort(); fileDelete("", filename); // 输出:0 ``` ### `quit()` 声明:function 关闭FTP客户端连接。Quit用于文件未传输时关闭连接,如果一个文件传输进程正在进行,请优先使用Abort() 可见性:public 返回:any ### `quote(command)` 声明:function 用于执行在这个类中未实现的FTP命令 可见性:public | 参数 | 类型 | 说明 | | --------- | ------ | --------------------------- | | `command` | string | 字符串类型,要执行的FTP命令 | 返回:integer ### `reInitialize(delay)` 声明:function 清除FTP客户端的账户及其设置信息 可见性:public | 参数 | 类型 | 说明 | | ------- | ------- | ------------------ | | `delay` | integer | 整数类型,延后时间 | 返回:integer ### `removeDir(dir_name)` 声明:function 移除FTP服务器上的目录 可见性:public | 参数 | 类型 | 说明 | | ---------- | ------ | --------------------------------------- | | `dir_name` | string | 字符串类型,FTP服务器上要移除的目录名称 | 返回:any #### 示例 ```tsl obj := new FTP(); obj.host := "127.0.0.1"; obj.port := 42121; obj.username := "tsl_user"; obj.password := "tsl_pass"; obj.passive := true; obj.connect(); obj.login(); obj.makeDir("tsl-remove-dir"); echo obj.removeDir("tsl-remove-dir"), "\n"; obj.abort(); // 输出:0 ``` ### `rename(source_file, dest_file)` 声明:function 重命名FTP服务器指定文件 可见性:public | 参数 | 类型 | 说明 | | ------------- | ------ | -------------------- | | `source_file` | string | 字符串类型,源文件名 | | `dest_file` | string | 字符串类型,新文件名 | 返回:any #### 示例 ```tsl filename := "/data/workspace/tmp/tsl-ftp-rename.txt"; pos := 0; writeFile(rwRaw(), "", filename, pos, 5, "hello"); source := new TMemoryStream(); source.loadFromFile("", filename); source.position := 0; obj := new FTP(); obj.host := "127.0.0.1"; obj.port := 42121; obj.username := "tsl_user"; obj.password := "tsl_pass"; obj.passive := true; obj.connect(); obj.login(); obj.put(source, "tsl-ftp-old.txt", false); echo obj.rename("tsl-ftp-old.txt", "tsl-ftp-new.txt"), "\n"; obj.delete("tsl-ftp-new.txt"); obj.abort(); fileDelete("", filename); // 输出:0 ``` ### `resumeSupported()` 声明:function 指出服务器上是否支持REST命令 可见性:public 返回:boolean ### `setCmdOpt(cmd, options)` 声明:function 设置指定一个在FTP命令之后的行为 可见性:public | 参数 | 类型 | 说明 | | --------- | ------ | --------------------------------- | | `cmd` | string | 字符串类型,受到Options影响的命令 | | `options` | string | 字符串类型,应用于FTP 会话的选项 | 返回:any ### `setLang(lang_tag)` 声明:function 请求以指定的语言返回响应的内容 可见性:public | 参数 | 类型 | 说明 | | ---------- | ------ | ------------------------------- | | `lang_tag` | string | 字符串类型,FTP客户端的语言标记 | 返回:any ### `setModTime(file_name, local_time)` 声明:function 设置指定文件的最后修改时间 可见性:public | 参数 | 类型 | 说明 | | ------------ | -------- | -------------------------------- | | `file_name` | string | 字符串类型,服务器上更新的文件名 | | `local_time` | datetime | 时间类型,指定文件修改的时间值 | 返回:any ### `setModTimeGMT(file_name, gmt_time)` 声明:function 设置指定文件的最后修改时间 可见性:public | 参数 | 类型 | 说明 | | ----------- | -------- | -------------------------------- | | `file_name` | string | 字符串类型,服务器上更新的文件名 | | `gmt_time` | datetime | 时间类型,指定文件修改的时间值 | 返回:any ### `site(command)` 声明:function 发送一个FTP服务器端的命令 可见性:public | 参数 | 类型 | 说明 | | --------- | ------ | -------------------------------------------------------------------------------------------------------------------------------------- | | `command` | string | 字符串类型,FTP服务器端命令名称。常常用来发发送没有包含在FTP协议中的服务器端命令。可以用HELP SITE命令查找指定FTP服务器的命令和语法信息 | 返回:any ### `size(file_name)` 声明:function 获取服务器上文件的大小信息 可见性:public | 参数 | 类型 | 说明 | | ----------- | ---- | --------- | | `file_name` | any | file_name | 返回:int64 #### 示例 ```tsl filename := "/data/workspace/tmp/tsl-ftp-size.txt"; pos := 0; writeFile(rwRaw(), "", filename, pos, 5, "hello"); source := new TMemoryStream(); source.loadFromFile("", filename); source.position := 0; obj := new FTP(); obj.host := "127.0.0.1"; obj.port := 42121; obj.username := "tsl_user"; obj.password := "tsl_pass"; obj.passive := true; obj.connect(); obj.login(); obj.put(source, "tsl-ftp-size.txt", false); echo obj.size("tsl-ftp-size.txt"), "\n"; obj.delete("tsl-ftp-size.txt"); obj.abort(); fileDelete("", filename); // 输出:5 ``` ### `status(status_list)` 声明:function 实现FTP的STAT命令 可见性:public | 参数 | 类型 | 说明 | | ------------- | ----------- | ------------------------------------------------ | | `status_list` | TStringList | 字符串列表类型,服务器响应的连接、传输参数等状态 | 返回:any ### `Account` 声明:property 获取或设置代表连接到远程FTP服务器的账户信息 可见性:public 类型:string 访问:read/write ### `AUTHCmd` 声明:property 表示登陆验证时使用的机制。这个属性的值决定在TSL握手协议中与FTP AUTH命令交换时使用的参数 可见性:public 类型:TAuthCmd 访问:read/write ### `AutoIssueFEAT` 声明:property 控制是否自动发送FEAT指令获得所支持的命令 可见性:public 类型:boolean 访问:read/write ### `AutoLogin` 声明:property 指定当使用Connect方法与FTP服务器建立会话时,FTP客户端是否自动连接 可见性:public 类型:boolean 访问:read/write ### `CanResume` 声明:property 表示服务器是否支持续传操作 可见性:public 类型:boolean 访问:read ### `CurrentTransferMode` 声明:property 表示当前FTP数据交换中有效的传输模式设置 可见性:public 类型:any 访问:read/write ### `DataPort` 声明:property 获取或设置与客户端会话的数据通道绑定的端口号 可见性:public 类型:integer 访问:read/write ### `DataPortMax` 声明:property 获取或设置FTP客户端数据通道的端口号上限 可见性:public 类型:integer 访问:read/write ### `DataPortMin` 声明:property 获取或设置FTP客户端数据通道的端口号下限 可见性:public 类型:integer 访问:read/write ### `DirFormat` 声明:property 表示目录列表结构 可见性:public 类型:string 访问:read ### `ExternalIP` 声明:property 指定当客户端在一个NAT防火墙后发送PORT或者EPRT命令时使用的IP地址 可见性:public 类型:string 访问:read/write ### `Host` 声明:property 表示FTP服务器的IP地址或者主机名称 可见性:public 类型:string 访问:read/write ### `LangsSupported` 声明:property 返回服务器支持的语言列表 可见性:public 类型:TStringList 访问:read ### `LastCmdResult` 声明:property 最后一条命令的返回结果,包括命令返回状态字以及结果 可见性:public 类型:TStringList 访问:read ### `ListenTimeout` 声明:property 获取或设置侦听成功的超时时间 可见性:public 类型:integer 访问:read/write ### `ListResult` 声明:property 获取最后一条LIST命令的返回 可见性:public 类型:TStringList 访问:read ### `Passive` 声明:property 指定FTP的数据通道连接方法,如果为真则采用被动模式 可见性:public 类型:boolean 访问:read/write ### `PassiveUseControlHost` 声明:property 如果设置为假,被动模式下依旧使用FTP的HOST属性,如果为真,则使用被动连接过来的对端IP地址。简单来说,如果设置为真,则允许分布式FTP服务,也就是对端可能是多个IP地址的FTP来发送或者接受数据 可见性:public 类型:boolean 访问:read/write ### `Password` 声明:property 获取或设置登陆FTP服务器时用于认证的凭据 可见性:public 类型:string 访问:read/write ### `Port` 声明:property 用于在打开连接时用到的远程FTP服务器主机上指定的端口号 可见性:public 类型:integer 访问:read/write ### `ProxyHost` 声明:property 获取或设置FTP代理的主机IP或名称 可见性:public 类型:string 访问:read/write ### `ProxyPassword` 声明:property 获取或设置FTP代理服务器的登陆密码 可见性:public 类型:string 访问:read/write ### `ProxyPort` 声明:property 获取或设置FTP代理服务器的端口号 可见性:public 类型:integer 访问:read/write ### `ProxyType` 声明:property 指定连接代理服务器时使用的方法。 0:使用代理服务器的CONNECT命令直接连接 1:采用USER命令,发送USER user@hostname串进行登录。 2:登录时发送SITE命令 3:发送OPEN命令 4:使用USER,PASS命令发送代理服务器的用户名密码,发送USER user@firewalluser@hostname 和 PASS pass@firewallpass 5:先使用USER,PASS命令使用代理服务器的用户名密码,穿透代理服务器,然后使用目标的用户名和密码 6:采用USER hostuserId@hostname firewallUsername模式。 7: Novell BorderManager Proxy 可见性:public 类型:integer 访问:read/write ### `ProxyUsername` 声明:property 获取或设置FTP代理服务器的登陆用户名 可见性:public 类型:string 访问:read/write ### `ReadTimeout` 声明:property 获取或设置客户端等待FTP连接响应时间的毫秒数 可见性:public 类型:integer 访问:read/write ### `RetrieveCurrentDir` 声明:property 获得服务器上当前目录的名称 可见性:public 类型:string 访问:read/write ### `SupportsVerification` 声明:property 表示FTP服务器是否支持完整性验证的扩展功能 可见性:public 类型:boolean 访问:read ### `SystemDesc` 声明:property 获取远程FTP服务器的操作系统的描述信息 可见性:public 类型:string 访问:read ### `TransferMode` 声明:property 实现FTP的MODE命令,设置FTP的传输模式,0为非压缩格式,1为压缩格式 可见性:public 类型:integer 访问:read/write ### `TransferTimeout` 声明:property 获取或设置FTP客户端在数据通道进行读操作时的等待时间的毫秒数 可见性:public 类型:integer 访问:read/write ### `TransferType` 声明:property 指定传输类型,包括Binary(0)和ASCII(1),默认使用Binary方式进行传输 可见性:public 类型:integer 访问:read/write ### `TryNATFastTrack` 声明:property 获取或设置指定是否使用"快速路径"连接穿越防火墙和地址转换器(NAT) 可见性:public 类型:any 访问:read/write ### `UseCCC` 声明:property 表示FTP客户端是否需要使用清除通道命令(CCC) 可见性:public 类型:boolean 访问:read/write ### `UseExtensionDataPort` 声明:property 指示在数据交换时是否使用了额外的IPV6端口以及是否设置为PASV模式 可见性:public 类型:boolean 访问:read/write ### `UseMLIS` 声明:property 指定当客户端试图获得目录列表时是否使用应该使用FTP的MLST或MLSD命令 可见性:public 类型:boolean 访问:read/write ### `Username` 声明:property 获取或设置登陆FTP服务器时使用的身份验证ID 可见性:public 类型:string 访问:read/write ### `UseSTARTTLS` 声明:property 控制是否使用显式 TLS(即 STARTTLS 加密协议) 可见性:public 类型:boolean 访问:read/write ### `UseTLS` 声明:property 用于指定传输安全等级 可见性:public 类型:boolean 访问:read/write ### `UsingExtDataPort` 声明:property 表示客户端会话是否支持RFC 2428 NAT 扩展 可见性:public 类型:boolean 访问:read ### `UsingNATFastTrack` 声明:property 表示客户端会话是否使用了"快速路径"连接 可见性:public 类型:boolean 访问:read ### `UsingSFTP` 声明:property 表示客户端会话是否使用了安全FTP连接 可见性:public 类型:any 访问:read