网盘——进入文件夹

ops/2024/10/19 5:27:23/

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

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.ppmy.cn/ops/24392.html

相关文章

JAVA内部类

内部类 Java内部类&#xff08;Inner Class&#xff09;是定义在另一个类&#xff08;外部类&#xff09;内部的一个类。这种嵌套类的定义允许更紧密的代码组织和更高的封装性。内部类可以访问其外部类的所有成员&#xff0c;包括私有成员&#xff0c;反之则不然。内部类可以有…

前端实现导入Excel进行数据展示、导出

需求 一个 excel 文档 需要对文档里面的数据进行筛选拆分重组 由于数据量巨大 后端又抽不出来手 于是使用纯前端解决方案 解决思路 前端导入excel 把 excel 的数据解析为 json 格式 对数据进行相应操作后 重新导出为新 excel 虽笨但有效 第一步 导入excel 该方案需引…

Docker(Docker的安装和介绍,常用命令,镜像制作,服务编排,docker私服)

目录 一、简介 1. docker简介 1 什么是docker 2 容器和虚拟机对比 2. 安装docker 1 docker相关概念 2 安装docker 1 安装docker 2 设置注册中心(仓库) 3. 小结 二、常用命令【重点】 1. 服务管理 2. 镜像管理 1 语法说明 2 使用练习 3. 容器管理 1 容器介绍 2…

c++判断一个数是否是2或3的n次方

判断一个数是否是2的n次方&#xff1a; bool fun(int n){return n>0&&(n&(-n))n; } 判断一个数是否是3的n次方&#xff1a; //方法1 如果这个数能被3整除&#xff0c;且最后是1&#xff0c;则一定是3的n次方 bool fun(int n){while(n&&n%30){n/3;}re…

5G工业数采网关的功能有哪些?-天拓四方

随着5G技术的不断发展&#xff0c;其在工业领域的应用日益广泛。5G工业数采网关作为连接工业设备与网络的重要枢纽&#xff0c;具备多种功能&#xff0c;为工业自动化、智能制造和智慧工厂提供了强大的支持。本文将详细解析5G工业数采网关的功能&#xff0c;并探讨其在工业领域…

UNIXRTC

这段代码是将写入的数据显示在OLED屏幕上&#xff0c;并进行读取。起初上电的时候可以发现W&#xff1a;后面为空&#xff0c;R:为0000 0000这是因为还没开始写入。按下按键后发现变换的数据是1235 5679&#xff0c;与我们写入的1234 5678不同&#xff0c;这是因为写入之前执行…

django序列化

path(get2/, views.HelloApiView().get), path(get2/, views.HelloApiView.as_view()) models class Student(models.Model):name models.CharField(max_length100,verbose_name姓名)age models.IntegerField(verbose_name年龄)sex models.BooleanField(default1,verbose_n…

【Jenkins】持续集成与交付 (九):Maven安装和配置、以及构建项目

🟣【Jenkins】持续集成与交付 (九):Maven安装和配置、以及构建项目 一、Maven简介二、持续集成环境安装Maven2.1 Maven软件包上传2.2 配置环境变量2.3 Jenkins配置关联JDK和Maven2.4 添加Jenkins全局变量2.5 修改Maven的settings.xml2.6 全局工具配置--设置自己的setting.…