在文件操作任务中,还有一项就是删除文件夹,具体步骤如下:
目录
[3.1、删除常规文件 note.txt](#3.1、删除常规文件 note.txt)
1、具体步骤:
A、客户端发送删除请求(包含目录信息和要删除的文件名)
目录信息:目录中还有子目录,子目录中还有子目录,必须将目录信息发送给服务器,这样服务器才知道在那个文件夹下面删除文件
B、服务器接收请求,在指定的文件夹下面,删除指定的文件,并发送回复信息给客户端。(成功失败)
C、客户端接收回复信息并显示。(成功与否)
2、代码实现
2.1、添加删除文件夹的槽函数
//删除文件夹
void deleteDir();
2.2、关联信号槽函数
//关联删除文件夹信号槽
connect(m_pDelDirPB,SIGNAL(clicked(bool)), this, SLOT(deleteDir()));
2.3、定义消息类型
ENUM_MSG_TYPE_DELETE_DIR_REQUEST, //删除目录请求
ENUM_MSG_TYPE_DELETE_DIR_RESPOND, //删除目录回复
2.4、槽函数的内容
void Book::deleteDir()
{
//获得当前所在的目录
QString strCurPath = TcpClient::getinstance().curPath();
//获得点击删除的文件
QListWidgetItem *pItem = m_pBookListW->currentItem();
//判断
if(NULL==pItem)
{
QMessageBox::warning(this,"删除文件","请选择要删除的文件");
}
else
{
//列表上面的文件名称
QString strDelName = pItem->text();
//路径太长了,放在caMsg里面,名字就放在caData里面
PDU *pdu =mkPDU(strCurPath.size()+1);
pdu->uiMsgType=ENUM_MSG_TYPE_DELETE_DIR_REQUEST;
strncpy((char*)(pdu->caData),strDelName.toStdString().c_str(),strDelName.size());
memcpy(pdu->caMsg,strCurPath.toStdString().c_str(),strCurPath.size());
//发送给服务器
TcpClient::getinstance().getTcpSocket().write((char*)pdu,pdu->uiPDULen);
free(pdu);
pdu=NULL;
}
}
2.5、在服务器端处理请求
2.6、添加删除目录的case
case ENUM_MSG_TYPE_DELETE_DIR_REQUEST:
{
//拼接路径
char caName[32] = {'\0'};
strcpy(caName,pdu->caData);
//产生一块空间,将传过来的路径拷贝出来
char *pPath = new char[pdu->uiMsgLen];
memcpy(pPath,pdu->caMsg,pdu->uiMsgLen);
//拼接成一条完整的路径
QString strPath = QString("%1/%2").arg(pPath).arg(caName);
//验证
qDebug()<<strPath;
break;
}
测试一下路径是否正确
打印成功,这块代码没有问题
2.7、查看是否为常规文件
但是要删除路径的话,我们首先需要判断一下,是不是一个路径,又可能是一个常规文件,不是一个目录,我们得判断一下,因为他们删除的方式不一样。
case ENUM_MSG_TYPE_DELETE_DIR_REQUEST:
{
//拼接路径
char caName[32] = {'\0'};
strcpy(caName,pdu->caData);
//产生一块空间,将传过来的路径拷贝出来
char *pPath = new char[pdu->uiMsgLen];
memcpy(pPath,pdu->caMsg,pdu->uiMsgLen);
//拼接成一条完整的路径
QString strPath = QString("%1/%2").arg(pPath).arg(caName);
//验证
// qDebug()<<strPath;
QFileInfo fileInfo(strPath);
bool ret = false;
if(fileInfo.isDir())
{//是个文件夹
QDir dir;
dir.setPath(strPath);
//removeRecursively删除路径,并且包括里面的文件.rmdir只能删除一个空的文件夹
ret = dir.removeRecursively();
}
else if(fileInfo.isFile())
{//常规文件,就不删除了
ret =false;
}
PDU *respdu =NULL;
if(ret)
{
//删除成功
respdu=mkPDU(strlen(DELETE_DIR_OK)+1);
respdu->uiMsgType=ENUM_MSG_TYPE_DELETE_DIR_RESPOND;
memcpy(respdu->caData,DELETE_DIR_OK,strlen(DELETE_DIR_OK));
}
else {
//删除失败
respdu=mkPDU(strlen(DELETE_DIR_FAILED)+1);
respdu->uiMsgType=ENUM_MSG_TYPE_DELETE_DIR_RESPOND;
memcpy(respdu->caData,DELETE_DIR_FAILED,strlen(DELETE_DIR_FAILED));
}
//发送
write((char*)respdu, respdu->uiPDULen);
free(respdu);
respdu =NULL;
break;
}
2.8、客户端收到回复信息进行显示
case ENUM_MSG_TYPE_DELETE_DIR_RESPOND:
{
QMessageBox::information(this,"删除文件夹",pdu->caData);
break;
}
3、测试
3.1、删除常规文件 note.txt
3.2、删除文件夹
3.3、刷新文件夹,看还在不在
成功