前一段时间,我上司叫我用QT写一个拷贝目录的小程序,开始我用的是QT中QNetworkAccessManager,实现拷贝文件很简单,但是没有提供查看对面目录的函数,也就是说无法查看对方的文件和目录,根本无法实现拷贝目录,不过我听大神说可以自己写一个查看对面目录的函数,但是我刚刚毕业,能力不够,时间上也不是很都,我只好用QFTP了。
QFTP现在已经被QT官方抛弃了,但是毕竟是官方库,还是很稳定的,自带list函数,可以查看对方的目录,拷贝文件非常方便。但是拷贝目录却遇到了大问题,我本来想用递归,但是Qt中拷贝文件是信号和槽机制,根本无法用递归。
然后我上司想到了一个办法,他叫我使用map<QString,bool>来保存目录信息,然后一个一个的遍历,每次遍历个,最终实现了拷贝目录的功能。
实在不想打字,我说的很简洁,上代码,希望能够给你帮助,这个是用不了的,复制粘贴很多都是不行的,我觉得就是里面的方法可以借鉴一下。
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFileDialog>
#include <QTreeWidgetItem>
#include <QDir>
#include <QThread>
#include <QMessageBox>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
addredit=new CIpAddrEdit(ui->centralWidget);
ui->progressBar->setValue(0);
//tab->setAutoFillBackground(true);
this->setAutoFillBackground(true);
Download_dir=0;
login_flag=0;
ftp=NULL;
}
MainWindow::~MainWindow()
{
delete ui;
}
//下载文件按钮转换的槽
void MainWindow::on_pushButton_clicked()
{
// qDebug()<< ui->comboBox_file->currentText();
bool judge=correctJudgment();
if(judge==false)
{
// qDebug()<<"errer";
return ;
}
QUrlInfo myFileInfo=fileInfo();
qDebug()<<"myFileinfo.name"<<myFileInfo.name();
init(true);
MY_downloading_path=ui->comboBox_catalog->currentText();
if(!myFileInfo.isDir())
{
ui->progressBar->setMaximum(1);
progressBarValue=0;
ui->progressBar->setValue(progressBarValue);
ui->progressBar->setValue(0);
qDebug()<<"进入下载按钮"<<endl;
QString filePath;
QString submitFile;
// submitFile=ui->lineEdit->text();
submitFile=ui->comboBox_file->currentText();
qDebug()<<"submitFile="<<submitFile<<endl;
//filePath = QFileDialog::getSaveFileName(this,tr("保存文件位置"), "C:\\Users\\Administrator\\Desktop");
filePath=ui->comboBox_catalog->currentText()+"\\"+submitFile;
qfile.setFileName(filePath);
if( !qfile.open(QIODevice::WriteOnly) )
{
qDebug() << "Error: cannot write file"
<< qPrintable(qfile.fileName()) << ":"
<< qPrintable(qfile.errorString()) ;
return ;
}
ftpFi