网盘——删除文件夹

在文件操作任务中,还有一项就是删除文件夹,具体步骤如下:

目录

1、具体步骤:

2、代码实现

2.1、添加删除文件夹的槽函数

2.2、关联信号槽函数

2.3、定义消息类型

2.4、槽函数的内容

2.5、在服务器端处理请求

2.6、添加删除目录的case

2.7、查看是否为常规文件

2.8、客户端收到回复信息进行显示

3、测试

[3.1、删除常规文件 note.txt](#3.1、删除常规文件 note.txt)

3.2、删除文件夹

3.3、刷新文件夹,看还在不在


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、刷新文件夹,看还在不在

成功

相关推荐
一个有温度的技术博主7 小时前
Linux 核心命令速查指南:从文件操作到系统运维
linux·服务器
Winner_hwx8 小时前
华为ICT大赛备赛复习1
服务器·网络·华为
宗介波妞9 小时前
Wireshark 抓取 IEC104 报文:常见异常报文排查与标志位解读
服务器·网络·wireshark
网硕互联的小客服10 小时前
各个版本的Linux系统如何修改远程端口ssh端口?
linux·运维·服务器·网络
T1mzhou10 小时前
ARM64 Linux 6.10 内核驱动(12):dd.c:probe/ remove、延迟 probe
linux·服务器·c语言·arm开发·arm
T1mzhou14 小时前
ARM64 平台安全学习记录
linux·服务器·arm开发·arm
tedcloud12315 小时前
God‘s Eye View 怎么搭建?在云服务器上部署一个实时 3D 地球可视化平台
linux·服务器·开发语言·后端·rust
初願致夕霞15 小时前
Linux 进程间通信(IPC)机制详解:管道、FIFO 与 System V 共享内存
linux·服务器·c++
傲世仙尊16 小时前
从磁盘硬件到Ext文件系统-Linux磁盘级文件系统学习笔记
linux·运维·服务器·开发语言·c++
曦夜日长16 小时前
Linux系统篇,进程概念(三):进程状态详解、僵尸进程与孤儿进程的深度解析、Slab机制的了解
linux·运维·服务器