网盘——进入文件夹

本文主要讲解网盘的文件操作中进入文件夹的部分,具体实现步骤如下:

1、具体步骤如下:

A、客户端发送进入文件夹的请求(该请求包含目录信息以及要进入的文件夹名字)

B、服务器收到该请求之后,服务器首先判断路径是否正确。

正确:则进入到该路径中,将新文件夹中的文件信息发送给客户端

不正确:回复失败给客户端

C、客户端接收来自服务器的回复信息并显示

2、代码实现

2.1、添加协议,进入文件夹的消息类型

 ENUM_MSG_TYPE_ENTER_DIR_REQUEST,  //进入文件夹请求
ENUM_MSG_TYPE_ENTER_DIR_RESPOND,  //进入文件夹回复

2.2、添加进入文件夹的槽函数

    //进入文件夹
void enterDir(const QModelIndex &index);

2.3、关联connect信号,doubleClicked双击

    //关联进入文件夹信号槽  doubleClicked双击connect(m_pBookListW,SIGNAL(doubleClicked(QModelIndex)),this, SLOT(enterDir(QModelIndex)));

2.4、添加槽函数定义

void Book::enterDir(const QModelIndex &index)
{//通过index获得双击的选项上面的内容QString strDirName = index.data().toString();//测试打印    //qDebug()<<strDirName;QString strCurPath = TcpClient::getinstance().curPath();PDU *pdu =mkPDU(strCurPath.size()+1);pdu->uiMsgType=ENUM_MSG_TYPE_ENTER_DIR_REQUEST;strncpy(pdu->caData,strDirName.toStdString().c_str(),strDirName.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_ENTER_DIR_REQUEST:{char caEnterName[32] = {'\0'};strncpy(caEnterName,pdu->caData,32);//产生一块空间,将传过来的路径拷贝出来char *pPath = new char[pdu->uiMsgLen];memcpy(pPath,pdu->caMsg,pdu->uiMsgLen);QString strPath = QString("%1/%2").arg(pPath).arg(caEnterName);qDebug()<<strPath;//判断是路径还是唱常规文件QFileInfo fileInfo(strPath);PDU *respdu =NULL;//判断类型if(fileInfo.isDir()){QDir dir(strPath);QFileInfoList fileInfoList = dir.entryInfoList();//产生pduint iFileCount = fileInfoList.size();PDU *respdu = mkPDU(sizeof (FileInfo)*iFileCount);respdu->uiMsgType = ENUM_MSG_TYPE_FLUSH_DIR_RESPOND;FileInfo *pFileInfo =NULL;QString strFileName;for(int i=0;i<iFileCount;i++){//拷贝进去,跳到下一个结构体pFileInfo = (FileInfo*)(respdu->caMsg)+i;strFileName = fileInfoList[i].fileName();memcpy(pFileInfo->caFileName,strFileName.toStdString().c_str(),strFileName.size());//判断类型if(fileInfoList[i].isDir()){pFileInfo->iFileType=0;//表示是个文件夹}else if(fileInfoList[i].isFile()) {pFileInfo->iFileType =1;//常规文件}}//发送write((char*)respdu, respdu->uiPDULen);free(respdu);respdu =NULL;}else if(fileInfo.isFile()) {respdu=mkPDU(0);respdu->uiMsgType=ENUM_MSG_TYPE_ENTER_DIR_RESPOND;strcpy(respdu->caData,ENTERE_DIR_FAILED);write((char*)respdu, respdu->uiPDULen);free(respdu);respdu =NULL;}break;}

2.7、客户端接收

        //---------------------进入文件夹------------------------case ENUM_MSG_TYPE_ENTER_DIR_RESPOND:{QMessageBox::information(this,"进入文件夹",pdu->caData);break;}

现在还是有点问题的,当我们进入文件夹的时候,当前的文件夹strCurPath应该更新的

2.8、添加清楚进入文件夹的函数

void Book::clearEnterDir()
{m_strEnterDir.clear();
}
     //---------------------进入文件夹------------------------case ENUM_MSG_TYPE_ENTER_DIR_RESPOND:{OpeWidget::getInstance().getBook()->clearEnterDir();QMessageBox::information(this,"进入文件夹",pdu->caData);break;}

3、测试

3.1、点击常规文件

3.2、点击文件夹,直接进入

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/652515.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024.4.26——LeetCode 高频题复盘

目录 3. 无重复字符的最长子串206. 反转链表146. LRU 缓存215. 数组中的第K个最大元素25. K 个一组翻转链表15. 三数之和53. 最大子数组和21. 合并两个有序链表1. 两数之和5. 最长回文子串912. 排序数组 3. 无重复字符的最长子串 题目链接 class Solution:def lengthOfLongest…

《红玫瑰与白玫瑰》读后感

张爱玲的小说《红玫瑰与白玫瑰》是在床上睡眼惺忪的状态下开始看的&#xff0c;越看越精神&#xff0c;最后竟几乎到了彻夜难眠的地步。小说不长&#xff0c;对男女感情的把握却妙到毫巅&#xff0c;令人击节赞叹。就着陈奕迅同曲异词的两首歌------《红玫瑰》《白玫瑰》&#…

基于FastGPT搭建知识库问答系统

什么是 FastGPT &#xff1f; FastGPT 是一个基于 LLM 大语言模型的知识库问答系统&#xff0c;提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排&#xff0c;从而实现复杂的问答场景&#xff01; FastGPT 允许用户构建本地知识库&#xff0c;…

备考2024年小学生古诗文大会:做做10道历年真题和知识点(持续)

根据往年的安排&#xff0c;2024年上海市小学生古诗文大会预计还有一个月就将启动。我们继续来随机看10道往年的上海小学生古诗文大会真题&#xff0c;这些题目来自我去重、合并后的1700在线题库&#xff0c;每道题我都提供了参考答案和独家解析。 根据往期的经验&#xff0c;只…

Vue入门篇:生命周期,钩子函数,工程化开发Vue(脚手架安装),组件化开发(全局注册,局部注册)

目录 1.Vue生命周期和生命周期的四个阶段2.Vue生命周期函数&#xff08;钩子函数)3.工程化开发&脚手架Vue CLI1.在powershell管理员权限下打开命令行安装脚手架&#xff1a;2.查看vue版本&#xff1a;3.创建项目架子4.运行项目 4.组件化开发&根组件1.App.vue文件&#…

「Kafka」Kafka单机和集群安装(二)

「Kafka」Kafka单机和集群安装&#xff08;二&#xff09; 一、单机启动1. 下载安装Kafka2. 启动ZooKeeper2. 启动Kafka 二 、集群启动1. 安装zookeeper2. 安装kakfa3. 封装启动脚本 一、单机启动 1. 下载安装Kafka 阿里云下载地址&#xff1a;Kafka阿里云镜像站&#xff0c;官…

AI大模型探索之路-训练篇5:大语言模型预训练数据准备-词元化

系列文章目录&#x1f6a9; AI大模型探索之路-训练篇1&#xff1a;大语言模型微调基础认知 AI大模型探索之路-训练篇2&#xff1a;大语言模型预训练基础认知 AI大模型探索之路-训练篇3&#xff1a;大语言模型全景解读 AI大模型探索之路-训练篇4&#xff1a;大语言模型训练数据…

全面解析平台工程与 DevOps 的区别与联系

平台工程的概念非常流行&#xff0c;但很多开发人员仍然不清楚它是如何实际运作的&#xff0c;这是非常正常的。 平台工程是与 DevOps 并行吗&#xff1f;还是可以相互替代&#xff1f;或者 DevOps 和平台工程是两个完全不同的概念&#xff1f; 一种比较容易将两者区分开来的方…

mysql中join内外连接查询例子

文章目录 join关键字概要举例using 与 on 区别 join关键字 在MySQL中&#xff0c;JOIN 是一种用于将两个或多个表中的行联合起来的操作。 连接&#xff08;join&#xff09;就是将一张表中的行按照某个条件&#xff08;连接条件&#xff09;与另一张表中的行连接起来形成一个新…

泰坦尼克号乘客生存情况预测分析2

泰坦尼克号乘客生存情况预测分析1 泰坦尼克号乘客生存情况预测分析2 泰坦尼克号乘客生存情况预测分析3 泰坦尼克号乘客生存情况预测分析总 背景描述 Titanic数据集在数据分析领域是十分经典的数据集&#xff0c;非常适合刚入门的小伙伴进行学习&#xff01; 泰坦尼克号轮船的…

react 基础学习笔记一

1、jsx语法过程 jsx使用react构造组件&#xff0c;通过bable进行编译成js对象&#xff0c;在用ReactDom.render()渲染成DOM元素&#xff0c;最后再插入页面的过程。 2、创建组件 组件的定义&#xff1a;将公用的代码组装成一个独立的文件&#xff0c;保持代码独立性&#xff0…

如何将图片压缩100k?几个方法帮你解决

很多平台为了保证用户体验&#xff0c;会限制我们上传图片的大小&#xff0c;所以我们在社交平台分享图片的时候&#xff0c;就会看有些要求为100kb的字样&#xff0c;那么我们怎么把一些过大的图片压缩100kb大小呢&#xff1f;试试下面介绍的这几个方法吧。 在工具栏中选择【…