• 网盘——删除文件夹


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

    目录

    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.2、删除文件夹

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


    1、具体步骤:

    A、客户端发送删除请求(包含目录信息和要删除的文件名)

    目录信息:目录中还有子目录,子目录中还有子目录,必须将目录信息发送给服务器,这样服务器才知道在那个文件夹下面删除文件

    B、服务器接收请求,在指定的文件夹下面,删除指定的文件,并发送回复信息给客户端。(成功失败)

    C、客户端接收回复信息并显示。(成功与否)

    2、代码实现

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

    1. //删除文件夹
    2. void deleteDir();

    2.2、关联信号槽函数

    1. //关联删除文件夹信号槽
    2. connect(m_pDelDirPB,SIGNAL(clicked(bool)), this, SLOT(deleteDir()));

    2.3、定义消息类型

    1. ENUM_MSG_TYPE_DELETE_DIR_REQUEST, //删除目录请求
    2. ENUM_MSG_TYPE_DELETE_DIR_RESPOND, //删除目录回复

    2.4、槽函数的内容

    1. void Book::deleteDir()
    2. {
    3. //获得当前所在的目录
    4. QString strCurPath = TcpClient::getinstance().curPath();
    5. //获得点击删除的文件
    6. QListWidgetItem *pItem = m_pBookListW->currentItem();
    7. //判断
    8. if(NULL==pItem)
    9. {
    10. QMessageBox::warning(this,"删除文件","请选择要删除的文件");
    11. }
    12. else
    13. {
    14. //列表上面的文件名称
    15. QString strDelName = pItem->text();
    16. //路径太长了,放在caMsg里面,名字就放在caData里面
    17. PDU *pdu =mkPDU(strCurPath.size()+1);
    18. pdu->uiMsgType=ENUM_MSG_TYPE_DELETE_DIR_REQUEST;
    19. strncpy((char*)(pdu->caData),strDelName.toStdString().c_str(),strDelName.size());
    20. memcpy(pdu->caMsg,strCurPath.toStdString().c_str(),strCurPath.size());
    21. //发送给服务器
    22. TcpClient::getinstance().getTcpSocket().write((char*)pdu,pdu->uiPDULen);
    23. free(pdu);
    24. pdu=NULL;
    25. }
    26. }

    2.5、在服务器端处理请求

    2.6、添加删除目录的case

    1. case ENUM_MSG_TYPE_DELETE_DIR_REQUEST:
    2. {
    3. //拼接路径
    4. char caName[32] = {'\0'};
    5. strcpy(caName,pdu->caData);
    6. //产生一块空间,将传过来的路径拷贝出来
    7. char *pPath = new char[pdu->uiMsgLen];
    8. memcpy(pPath,pdu->caMsg,pdu->uiMsgLen);
    9. //拼接成一条完整的路径
    10. QString strPath = QString("%1/%2").arg(pPath).arg(caName);
    11. //验证
    12. qDebug()<<strPath;
    13. break;
    14. }

    测试一下路径是否正确

    打印成功,这块代码没有问题

    2.7、查看是否为常规文件

    但是要删除路径的话,我们首先需要判断一下,是不是一个路径,又可能是一个常规文件,不是一个目录,我们得判断一下,因为他们删除的方式不一样。

    1. case ENUM_MSG_TYPE_DELETE_DIR_REQUEST:
    2. {
    3. //拼接路径
    4. char caName[32] = {'\0'};
    5. strcpy(caName,pdu->caData);
    6. //产生一块空间,将传过来的路径拷贝出来
    7. char *pPath = new char[pdu->uiMsgLen];
    8. memcpy(pPath,pdu->caMsg,pdu->uiMsgLen);
    9. //拼接成一条完整的路径
    10. QString strPath = QString("%1/%2").arg(pPath).arg(caName);
    11. //验证
    12. // qDebug()<<strPath;
    13. QFileInfo fileInfo(strPath);
    14. bool ret = false;
    15. if(fileInfo.isDir())
    16. {//是个文件夹
    17. QDir dir;
    18. dir.setPath(strPath);
    19. //removeRecursively删除路径,并且包括里面的文件.rmdir只能删除一个空的文件夹
    20. ret = dir.removeRecursively();
    21. }
    22. else if(fileInfo.isFile())
    23. {//常规文件,就不删除了
    24. ret =false;
    25. }
    26. PDU *respdu =NULL;
    27. if(ret)
    28. {
    29. //删除成功
    30. respdu=mkPDU(strlen(DELETE_DIR_OK)+1);
    31. respdu->uiMsgType=ENUM_MSG_TYPE_DELETE_DIR_RESPOND;
    32. memcpy(respdu->caData,DELETE_DIR_OK,strlen(DELETE_DIR_OK));
    33. }
    34. else {
    35. //删除失败
    36. respdu=mkPDU(strlen(DELETE_DIR_FAILED)+1);
    37. respdu->uiMsgType=ENUM_MSG_TYPE_DELETE_DIR_RESPOND;
    38. memcpy(respdu->caData,DELETE_DIR_FAILED,strlen(DELETE_DIR_FAILED));
    39. }
    40. //发送
    41. write((char*)respdu, respdu->uiPDULen);
    42. free(respdu);
    43. respdu =NULL;
    44. break;
    45. }

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

    1. case ENUM_MSG_TYPE_DELETE_DIR_RESPOND:
    2. {
    3. QMessageBox::information(this,"删除文件夹",pdu->caData);
    4. break;
    5. }

    3、测试

    3.1、删除常规文件 note.txt

    3.2、删除文件夹

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

    成功

  • 相关阅读:
    ElasticSearch(超详细解说)[springBoot整合ES并简单实现增删改查]
    AI落地难?云原生助力企业快速应用机器学习 MLOps
    Python高级_第5章_Python高级语法与正则表达式
    MybatisPlus【SpringBoot】 5 条件构造器和常用接口 5.1 wrapper 介绍 & 5.2 QueryWrapper
    第十九次CCF计算机软件能力认证
    LeetCode 251:展开二维向量
    Centos Sendmail
    【node.js】第六章 初识express
    机器学习之集成学习算法简介
    软件工程评级B-,有大量调剂名额。北京联合大学考情分析
  • 原文地址:https://blog.csdn.net/wjl990316fddwjl/article/details/137952632