编程模型我理解为 相关领域的api的使用方式,先后次序。有对象式的,有命令相应式的等等。
如果要用QFtp 写程序 比如下载指定服务器的目录(递归)
如果不知道的它的编程模型 会是一头雾水
qftp 和常规编程不一样是基于命令列表处理数据的
以qt4gui编程的15章中 编写ftp客户端为例
对于ftp的编程模型
ftp发出一系列命令 如 connectToHost,login,cd .list(),onCommandStarted ,onCommandFinished,done等命令,
这些命令之间的关系,使用约定 ,决定这程序的开发方式
1:每个命令发出时 发射 onCommandStarted 结束时 发射OnComandFinished 信号 可以根据参数 判断当前执行的是什么命令,以及执行动作
2:list()每发现一个文件/目录就发射一个listIInfo信号,而不是list完当前目录就发射一次listInfo信号。
3:done 信号什么是否发射呢????
当命令队列中没有命令了就发射。而不是ftp退出时才发射 。理解这点很重要,
4:list一个目录后没有再执行其他命令时 队列就没命令了此时发射 done信号
要搞清这些命令之间的使用前置条件 后置条件,否则各个命令你中有我我中有你,叫人没有头绪使用这些api
举例 实现15章中ftp客户端中的 p276页中只浏览当前目录 。当前录浏览后再一起下载当前目录的文件,(不是list一个文件就下载一个文件,书上是浏览一个文件下载一个文件)
首先 增加一个成员变量 QStringList 记录list当前目录 得到的文件名 ,当list下一个目录之前清空。
ftpListInfo(const QUrlInfo& urlInfo)
{//beg
if(urlInfo.isFile()){
if(urlInfo.isReadable())
{
filePathList.append(urlInfo.name());
}
}
else if(urlInfo.isDir())
{
pendingDirs.append(currentDir+"/"+urlInfo.name());//注意这里要记录路径**********************************
}
}//end
ftpdone(bool error)
{//begin
if(error) return;
if(openedFiles.size()>0)
{
qDeleteAll(openedFiles);
openedFiles.clear();
}
for(int i=0;i< filePathList.size();i++)
{
QFile * file= new QFile(currentLocalDir +"/"+filePathLit[i]);
if(file->open(QIODivce::WiteOnly)){ return ; }
ftp.get(filePathList[i],file);
openfileFiles.append(file);
}
filePathList.clear();//清空当前目录的文件列表
proccessNextDirectroy();
}//emd
由于是手工敲击 难免笔误 。思路是对的,并已执行成功