本文主要讲解网盘文件操作部分的移动文件,具体步骤如下:
目录
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下面
成功!!!!!!!!!!