网盘——移动文件

本文主要讲解网盘文件操作部分的移动文件,具体步骤如下:

目录

1、实施步骤:

2、代码实现

2.1、在book里面添加移动文件的按钮

2.2、将他添加到界面

2.3、添加移动文件的槽函数

2.4、关联槽函数

2.5、在book中添加成员函数,保存要移动的文件名字

2.6、将路径和文件名拼接成一个访问路径

2.7、选择移动到那个文件夹里面去

A、添加按钮,选择移动到那个文件夹

B、添加到界面

C、添加移动文件目标目录槽函数

D、关联信号槽

E、添加槽函数定义

2.8、添加移动文件的协议

2.9、产生PDU,发送移动文件的请求

2.10、服务器收请求的case

2.11、服务器收到回复做显示

3、测试

3.1、打开图书,选择要移动的文件,先点击常规文件,点击移动文件按钮,目标目录按钮变亮,可以点击。

3.2、点击目标目录,报错。因为是常规文件 

3.3、将文件一定到aaa里面

3.4、点击aaa,目标目录


1、实施步骤:

A、客户端发送移动文件请求(请求包含当前目录,目标目录)

B、服务器接收请求之后,根据请求中指定的目录和目标目录进行移动,移动完成之后,回复客户端

C、客户端接收到回复信息之后,进行显示

2、代码实现

2.1、在book里面添加移动文件的按钮

    //移动文件
    QPushButton *m_pMoveFilePB;

2.2、将他添加到界面

    m_pMoveFilePB = new QPushButton("移动文件");
    pFileVBL->addWidget(m_pMoveFilePB);

展示界面

2.3、添加移动文件的槽函数

    //移动文件
    void MoveFile();

2.4、关联槽函数

   //关联移动文件槽函数
    connect(m_pMoveFilePB, SIGNAL(clicked(bool)),
            this, SLOT(moveFile()));

2.5、在book中添加成员函数,保存要移动的文件名字

    //保存要移动的文件名
    QString m_strMoveFileName;

2.6、将路径和文件名拼接成一个访问路径

    QString m_strMoveFilePath;

2.7、选择移动到那个文件夹里面去

A、添加按钮,选择移动到那个文件夹

    //选择要移动到那个文件夹
    QPushButton *m_pSelectDirPB;

B、添加到界面

    m_pMoveFilePB= new QPushButton("目标目录");
    //假如没有选择移动文件的话,将这个按键设置成灰的,选不了的
    m_pMoveFilePB->setEnabled(false);
    pFileVBL->addWidget(m_pSelectDirPB);

C、添加移动文件目标目录槽函数

    void selectDestDir();

D、关联信号槽

    //关联目标目录的槽函数
    connect(m_pSelectDirPB, SIGNAL(clicked(bool)),
            this, SLOT(selectDestDir()));

E、添加槽函数定义

void Book::selectDestDir()
{
    //选择要移动的文件
    QListWidgetItem *pCurItem = m_pBookListW->currentItem();
    if(NULL != pCurItem)
    {//表示选择了一个文件
        //获得目的地路径
        QString strDestDir = pCurItem->text();
        //当前所在的路径
        QString strCurPath =  TcpClient::getinstance().curPath();
        //将路径和文件名拼接成一个访问的路径
        m_strDestDir = strCurPath+'/'+strDestDir;
        //选择移动到那个文件夹里面去
        //产生PDU,发送移动文件的请求
        int srclen = m_strMoveFilePath.size();
        int destlen = m_strDestDir.size();
        PDU *pdu = mkPDU(srclen+destlen+2);
        pdu->uiMsgType = ENUM_MSG_TYPE_MOVE_FILE_REQUEST;
        sprintf(pdu->caData,"%d %d %s", srclen, destlen, m_strMoveFileName.toStdString().c_str());
        memcpy(pdu->caMsg,m_strMoveFilePath.toStdString().c_str(),srclen);
        memcpy((char*)(pdu->caMsg)+(srclen+1), m_strDestDir.toStdString().c_str(),destlen);
        TcpClient::getinstance().getTcpSocket().write((char*)pdu,pdu->uiPDULen);
        free(pdu);
        pdu = NULL;
    }
    else {
        QMessageBox::warning(this, "移动文件", "请选择要移动的文件");
    }
    m_pSelectDirPB->setEnabled(false);
}

2.8、添加移动文件的协议

    ENUM_MSG_TYPE_MOVE_FILE_REQUEST, //移动文件请求
    ENUM_MSG_TYPE_MOVE_FILE_RESPOND, //移动文件回复

2.9、产生PDU,发送移动文件的请求

void Book::selectDestDir()
{
    //选择要移动的文件
    QListWidgetItem *pCurItem = m_pBookListW->currentItem();
    if(NULL != pCurItem)
    {//表示选择了一个文件
        //获得目的地路径
        QString strDestDir = pCurItem->text();
        //当前所在的路径
        QString strCurPath =  TcpClient::getinstance().curPath();
        //将路径和文件名拼接成一个访问的路径
        m_strDestDir = strCurPath+'/'+strDestDir;
        //选择移动到那个文件夹里面去
        //产生PDU,发送移动文件的请求
        int srclen = m_strMoveFilePath.size();
        int destlen = m_strDestDir.size();
        PDU *pdu = mkPDU(srclen+destlen+2);
        pdu->uiMsgType = ENUM_MSG_TYPE_MOVE_FILE_REQUEST;
        sprintf(pdu->caData,"%d %d %s", srclen, destlen, m_strMoveFileName.toStdString().c_str());
        memcpy(pdu->caMsg,m_strMoveFilePath.toStdString().c_str(),srclen);
        memcpy((char*)(pdu->caMsg)+(srclen+1), m_strDestDir.toStdString().c_str(),destlen);
        TcpClient::getinstance().getTcpSocket().write((char*)pdu,pdu->uiPDULen);
        free(pdu);
        pdu = NULL;
    }
    else {
        QMessageBox::warning(this, "移动文件", "请选择要移动的文件");
    }
    m_pSelectDirPB->setEnabled(false);
}

2.10、服务器收请求的case

            //-----------------移动文件---------------
        case ENUM_MSG_TYPE_MOVE_FILE_REQUEST:
        {
            //两个路径大小
            char caFileName[32] = {'\0'};
            int srclen =0;
            int destlen =0;
            sscanf(pdu->caData, "%d%d%s", &srclen, &destlen, caFileName);

            //产生空间,将地址拷贝出来
            char *pSrcPath = new char[srclen+1];
            //+32从一个路径移动到另一个路径,移动时候必须在目的路径里面只当他的名字
            char *pDestPath = new char[destlen+1+32];
            memset(pSrcPath, '\0', srclen+1); //清空空间
            memset(pDestPath, '\0', destlen+1+32);

            memcpy(pSrcPath, pdu->caMsg, srclen);
            memcpy(pDestPath, (char*)(pdu->caMsg)+(srclen+1), destlen);

            PDU *respdu =mkPDU(0);
            respdu->uiMsgType = ENUM_MSG_TYPE_MOVE_FILE_RESPOND;
            QFileInfo fileinfo(pDestPath);
            if(fileinfo.isDir())
            {
                strcat(pDestPath, "/");
                strcat(pDestPath, caFileName);

                bool ret = QFile::rename(pSrcPath, pDestPath);
                if(ret)
                {
                    strcpy(respdu->caData, MOVE_FILE_OK);

                }
                else {
                    strcpy(respdu->caData, COMMON_ERROR);
                }
            }
            else if (fileinfo.isFile()) {
                strcpy(respdu->caData, MOVE_FILE_FAILED);
            }
            write((char*)respdu, respdu->uiPDULen);

            free(respdu);
            respdu=NULL;

            break;
        }

2.11、服务器收到回复做显示

         //---------------------移动文件------------------------
        case ENUM_MSG_TYPE_MOVE_FILE_RESPOND:
        {
            QMessageBox::information(this,"移动文件",pdu->caData);
            break;
        }

3、测试

3.1、打开图书,选择要移动的文件,先点击常规文件,点击移动文件按钮,目标目录按钮变亮,可以点击。

3.2、点击目标目录,报错。因为是常规文件 

3.3、将文件一定到aaa里面

3.4、点击aaa,目标目录

成功,在文件目录里面查看一下

刚开始test.txt在jack文件夹下

现在在aaa下面

成功!!!!!!!!!!

4、到此,所有的关于网盘的操作都已经结束了,大家如果感兴趣的话,可以看我之前的文章哦!!!!!!!后续我整理一下,会将代码上传的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值