使用QFTP拷贝文件夹和目录

       前一段时间,我上司叫我用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;
}
 

猜你喜欢

转载自blog.csdn.net/qq_34124006/article/details/81095799