1、使用QFTP想遍历远程目录,同时本地还要进行筛选过滤,由于QFTP只能通过如下
connect(m_pFtp,SIGNAL(listInfo(QUrlInfo)),this,SLOT(slot_listInfo(QUrlInfo)));
信号槽这种方式,所以就无法进行递归遍历。
解决方法:由于已经知晓远程目录的具体层级,每层的目录名称,所以本人使用了树形结构来存储远程目录。界面启动的同时,先初始化树形结构,后边筛选遍历的时候可以直接递归遍历树形结构即可。遍历的时候,可根据不同文件深度来跟界面的筛选条件比较。
class TreeNode {
public:
QString name; //文件名
QString path; //路径
int depth; //文件夹层级/深度
bool used; //是否显示
QVector<TreeNode*> children;
TreeNode(const QString& data) : name(data) {}
void addChild(TreeNode* child) {
children.push_back(child);
}
~TreeNode() {
for (auto child : children) {
delete child;
}
}
};
由于每一个节点都存储当前的文件名称以及路径,最终get的时候可以将每一层的路径拼接起来形成最终的文件路径,先cd进去最终目录,再get文件到本地。
2、由于树形结构存储的文件名称中带有中文,最终cd和get的时候都会失败,无法打开该目录。
解决方法:QFtp::cd函数中使用的是QLatin1String,所以cd的参数传入时转换为QLatin1
QString strFile = "/中文目录"; QString strPath = QString::fromLatin1(strFile.toLocal8Bit()); m_pFtp->cd(strPath);