编程模型我理解为 相关领域的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

 由于是手工敲击 难免笔误 。思路是对的,并已执行成功

posted on 2020-08-21 19:19  keleman  阅读(608)  评论(0编辑  收藏  举报