前一段时间,我上司叫我用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 ;
}
ftpFileNamePath=myFileInfo.name();
mapfile.insert(ftpFileNamePath,false);
ftp->get(submitFile,&qfile);
}
//下载目录
else
{
Download_dir=1;
ftpFilePath=myFileInfo.name();
mapDir.insert(ftpFilePath,false);
QString myDirName=MY_downloading_path+"\\"+ftpFilePath;
if(!dir.exists(myDirName))
{
dir.mkdir(myDirName);
}
listnumber=ftp->list(ftpFilePath);
//qDebug()<<"list="<<lis;
}
}
//选择目录
void MainWindow::on_pushButton_2_clicked()
{
QUrlInfo myFileInfo=fileInfo();
//qDebug()<<"myFileinfo.name"<<myFileInfo.name();
QString DIr=QDir::toNativeSeparators(QFileDialog::getExistingDirectory(this,tr("Save path"),QDir::currentPath()));
if(!DIr.isEmpty())
{
if(ui->comboBox_catalog->findText(DIr)==-1)
ui->comboBox_catalog->addItem(DIr);
ui->comboBox_catalog->setCurrentIndex(ui->comboBox_catalog->findText(DIr));
}
}
//输入账号和密码
void MainWindow::init(bool mode)
{
if(mode == true)
{
m_ftp.setHostPort(addredit->m_strGetText());
m_ftp.setUserInfo();
ui->pushButton->setEnabled(false);
ui->pushButton_2->setEnabled(false);
ui->pushButton_3->setEnabled(false);
ui->pushButton_4->setEnabled(false);
}
if(mode == false)
{
ui->pushButton->setEnabled(true);
ui->pushButton_2->setEnabled(true);
ui->pushButton_3->setEnabled(true);
ui->pushButton_4->setEnabled(true);
// pDownloadButton->setEnabled(true);
}
}
//返回文件信息
QUrlInfo MainWindow::fileInfo()
{
for(int i=0;i<My_file_infe.size();i++)
{
if(My_file_infe.at(i).name()==ui->comboBox_file->currentText())
return My_file_infe.at(i);
}
}
//拷贝文件
void MainWindow::copyfile(QString submitFile, QString filePath)
{
ui->progressBar->setValue(0);
m_ftp.get(submitFile,filePath);
connect(&m_ftp, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(error(QNetworkReply::NetworkError)));
connect(&m_ftp, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(downloadProgress(qint64, qint64)));
}
//目录列表处理
void MainWindow::DirListProcess()
{
QMap<QString,bool>::const_iterator mi=mapDir.find(ftpFilePath);
if(mi!=mapDir.end())
{
mapDir.insert(ftpFilePath,true);
// qDebug()<<"QMap<QString,bool>::const_iterator mi=mapDir.find="<<mi.key();
}
QMap<QString,bool>::const_iterator i;
// mapDir::const_iterator i;
for(i=mapDir.constBegin();i!=mapDir.constEnd();++i)
{
// mapDir.key();
if(i.value()==false)
{
ftpFilePath=i.key();
listnumber=ftp->list(ftpFilePath);
return ;
}
qDebug()<<"mapDir.key()=="<<i.key()<<"mapDir.value()"<<i.value();;
}
ui->progressBar->setMaximum(mapfile.size());
progressBarValue=0;
ui->progressBar->setValue(progressBarValue);//.。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
QMap<QString,bool>::const_iterator j;
for(j=mapfile.constBegin();j!=mapfile.constEnd();++j)
{
if(j.value()==false)
{
ftpFileNamePath=j.key();
QString myfilepath=MY_downloading_path+"\\"+ftpFileNamePath;
qfile.setFileName(myfilepath);
if( !qfile.open(QIODevice::WriteOnly) )
{
qDebug() << "Error: cannot write file"
<< qPrintable(qfile.fileName()) << ":"
<< qPrintable(qfile.errorString()) ;
return ;
}
ftp->get(ftpFileNamePath,&qfile);
return ;
}
}
}
//Qftp拷贝目录进程
void MainWindow::qftpCopyProcess()
{
QMap<QString,bool>::const_iterator mi=mapfile.find(ftpFileNamePath);
if(mi!=mapfile.end())
{
mapfile.insert(ftpFileNamePath,true);
}
QMap<QString,bool>::const_iterator i;
for(i=mapfile.constBegin();i!=mapfile.constEnd();++i)
{
if(i.value()==false)
{
ftpFileNamePath=i.key();
QString myfilepath=MY_downloading_path+"\\"+ftpFileNamePath;
qfile.setFileName(myfilepath);
if( !qfile.open(QIODevice::WriteOnly) )
{
return ;
}
ftp->get(ftpFileNamePath,&qfile);
return ;
}
}
mapfile.clear();
mapDir.clear();
init(false);
ui->lineEdit_2->setText("下载成功");
}
void MainWindow::downloadProgress(qint64 bytesReceived, qint64 bytesTotal)
{
ui->progressBar->setMaximum(bytesTotal);
ui->progressBar->setValue(bytesReceived);
init(false);
}
// 错误处理
void MainWindow::error(QNetworkReply::NetworkError error)
{
switch (error) {
case QNetworkReply::HostNotFoundError :
break;
// 其他错误处理
default:
break;
}
}
//判断参数是否标准
bool MainWindow::correctJudgment()
{
QString Ip;
Ip=addredit->m_strGetText();
if(Ip.isEmpty()!=0)
{
ui->lineEdit_2->setText("错误:please enter IP number");
return false;
}
QString submitFile;
submitFile=ui->comboBox_file->currentText();
if(submitFile.isEmpty()!=0)
{
//qDebug()<<"Please enter the required file."<<endl;
ui->lineEdit_2->setText("错误:Please enter the required file.");
return false;
}
QString filePath;
filePath=ui->comboBox_catalog->currentText();
if(filePath.isEmpty()!=0)
{
ui->lineEdit_2->setText("错误:please enter download path");
return false;
}
return true;
}
//需要修改连接
void MainWindow::on_pushButton_3_clicked()
{
// ui->comboBox_file->clear();
if(ftp)
{
ftp->abort();
ftp->deleteLater();
ftp = 0;
}
ftp =new QFtp(this);
ui->lineEdit_2->setText("开始连接");
Download_dir=0;
ftp->connectToHost(addredit->m_strGetText(),21);
ftp->login("anonymous","[email protected]");
ftp->list();
stateChanged(ftp->state());
connect(ftp, SIGNAL(commandFinished(int, bool)),this, SLOT(ftpCommandFinished(int,bool)));
connect(ftp, SIGNAL(done(bool)), this, SLOT(Ftpdone(bool)));
connect(ftp, SIGNAL(listInfo(QUrlInfo)), this, SLOT(addToList(QUrlInfo)));
connect(ftp,SIGNAL(stateChanged(int)),this,SLOT(stateChanged(int)));
login_flag=1;
}
//信息结束处理
void MainWindow::ftpCommandFinished(int n, bool bo)
{
Q_UNUSED(n);
QFtp::Command command = ftp->currentCommand();
switch (command) {
case QFtp::List: { // 连接 FTP 服务器
if (bo) { // 发生错误
QMessageBox::information(this, "FTP", QStringLiteral("查看目录错误"));
init(false);
} else {
DirListProcess();
}
break;
}
case QFtp::Get:
{
if(bo)
{
QMessageBox::information(this, "FTP", QStringLiteral("下载文件错误"));
}
else
{
ui->progressBar->setValue(++progressBarValue);//.。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
qfile.close();
qftpCopyProcess();
}
}
default:
break;
}
}
void MainWindow::Ftpdone(bool errer)
{
if(errer==false)
{
ui->lineEdit_2->setText("连接成功");
}
else
{
ui->lineEdit_2->setText("连接失败");
}
}
//返回对面目录******************************************************************************
void MainWindow::addToList(QUrlInfo urlInfo)
{
if(Download_dir==0)
{
QString fileName=urlInfo.name();
if(!fileName.isEmpty())
{
if(ui->comboBox_file->findText(fileName)==-1)
ui->comboBox_file->addItem(fileName);
// ui->comboBox_catalog->setCurrentIndex(ui->comboBox_catalog->findText(directory));
}
My_file_infe.append(urlInfo);
}
else
{
if(!urlInfo.isDir())
{
QString Ftpfilename=ftpFilePath+"//"+urlInfo.name();
mapfile.insert(Ftpfilename,false);
}
else
{
QString FtpDirname=ftpFilePath+"//"+urlInfo.name();
mapDir.insert(FtpDirname,false);
QString Myfilename=MY_downloading_path+"//"+FtpDirname;
if(!dir.exists(Myfilename))
{
dir.mkdir(Myfilename);
}
}
}
}
void MainWindow::stateChanged(int state)
{
switch (state) {
case QFtp::Unconnected: {
ui->lineEdit_2->setText(QStringLiteral("没有连接到主机"));
break;
}
case QFtp::HostLookup: {
ui->lineEdit_2->setText(QStringLiteral("正在进行主机名查找"));
break;
}
case QFtp::Connecting: {
ui->lineEdit_2->setText(QStringLiteral("正在尝试连接到主机"));
break;
}
case QFtp::Connected: {
ui->lineEdit_2->setText(QStringLiteral("已实现与主机的连接"));
break;
}
case QFtp::LoggedIn: {
ui->lineEdit_2->setText(QStringLiteral("已实现连接和用户登录"));
break;
}
case QFtp::Closing: {
ui->lineEdit_2->setText(QStringLiteral("连接正在关闭"));
break;
}
default:
break;
}
}
void MainWindow::on_pushButton_4_clicked()
{
ui->comboBox_catalog->clear();
ui->progressBar->setValue(0);
ui->lineEdit_2->setText("刷新");
login_flag=0;
}