简述
QFtp 类提供了一个 FTP 协议的客户端实现。
该类提供了一个到 FTP 的直接接口允许对请求有更多的控制。但是对于新的应用程序建议使用 QNetworkAccessManager 和 QNetworkReply因为这些类拥有一个更简单、还更强大的 API。
QFtp
QFtp 异步工作因此没有阻塞函数。如果无法立即执行操作函数仍将立即返回并且该操作将被调度以供以后执行。调度操作的结果通过信号报告这种方法依赖于事件循环操作。
可以调度的操作也被称为“命令”有connectToHost()、login()、close()、list()、cd()、get()、put()、remove()、mkdir()、rmdir()、rename() 和 rawCommand()。
所有这些命令都会返回一个唯一的标识符允许跟踪当前正在执行的命令。当命令的执行开始时发出带有命令标识符的 commandStarted() 信号。当命令完成时会发出 commandFinished() 信号并带有命令标识符和一个 bool 参数表明该命令在完成时是否出错。
在某些情况下可能想要执行一系列命令。例如如果要连接并登录到 FTP 服务器简单的实现如下
QFtp *ftp = new QFtp(parent);
ftp->connectToHost("192.168.***.***", 21);
ftp->login("wang", "123456");
在这种情况下调度了两个 FTP 命令。当最后一个调度命令完成时会发出 done() 信号并带有一个 bool 参数告诉你序列在完成时是否出错。
如果命令序列中的某个命令的执行期间发生错误则所有挂起的命令即已调度但尚未执行的命令会被清除并且不为它们发射信号。
一些命令例如 list() 会发出额外的信号listInfo()以报告其结果。
对于文件传输QFtp 可以使用主动或被动模式并且默认使用被动文件传输模式可使用 setTransferMode() 设置。
调用 setProxy() 使 QFtp 通过 FTP 代理服务器连接。
函数 hasPendingCommands() 和 clearPendingCommands() 允许查询和清除挂起的命令列表。
如果你在网络方便比较有经验想要有完整的控制可以使用 rawCommand() 来执行任意 FTP 命令。
警告当前版本的 QFtp 不完全支持非 Unix FTP 服务器。
工作流程
如果要从 FTP 服务器下载 /home/wang/ftp.qdoc 文件可以分为下面几步
ftp->connectToHost("192.168.***.***", 21); // id == 1
ftp->login("wang", "123456"); // id == 2
ftp->cd("/home/wang"); // id == 3
ftp->get("ftp.qdoc"); // id == 4
ftp->close(); // id == 5
流程如下
- connectToHost() - 指定主机和端口号连接 FTP 服务器
- login() - 指定用户名和密码登录到 FTP 服务器
- cd() - 改变服务器的工作目录为 /etc类似于 Linux 下的命令行cd /home/wang
- get() - 从服务器上下载文件 passwd绝对路径为/home/wang/ftp.qdoc
- close() - 关闭到 FTP 服务器的连接
对于该示例发射以下序列的信号
commandStarted(1)
stateChanged(HostLookup)
stateChanged(Connecting)
stateChanged(Connected)
commandFinished(1, false)
commandStarted(2)
stateChanged(LoggedIn)
commandFinished(