本文主要讲解网盘文件操作部分的移动文件,具体步骤如下:
目录
3.1、打开图书,选择要移动的文件,先点击常规文件,点击移动文件按钮,目标目录按钮变亮,可以点击。
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下面
成功!!!!!!!!!!