网盘——进入文件夹

news2024/12/23 12:31:44

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

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();
            
            //产生pdu
            int 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.coloradmin.cn/o/1627910.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于springboot的考勤管理系统

文章目录 项目介绍主要功能截图&#xff1a;部分代码展示设计总结项目获取方式 &#x1f345; 作者主页&#xff1a;超级无敌暴龙战士塔塔开 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &…

C#基础之数组

数组 文章目录 数组1、概念2、数组的声明3、数组的使用思考1 找出随机数中的最大值&#xff0c;最小值思考2 数组值前后交换思考3 输入成绩&#xff0c;比较出最大、最小值思考4 生成一个5X5的花格子 二维数组交错数组 1、概念 数组是存储一组相同类型数据的集合 数组分为一维…

【嵌入式AI开发】轻量级卷积神经网络MobileNetV1网络详解

传统卷积神经网络,内存需求大、运算量大导致无法在移动设备以及嵌入式设备上运行。模型研究得初衷就是服务于社会,应用到实际生活中,让深度学习技术服务于生活。 万物互联时代,智能终端部署模型到本地,不需连接因特网/云服务器,在边缘终端进行边缘计算。保障数据隐私,不…

【数据结构】三、栈和队列:2.顺序栈共享栈(顺序栈的初始化,判空,进栈,出栈,读取栈顶,顺序栈实例)

文章目录 1.顺序栈1.1初始化1.2判空1.3进栈1.4出栈1.5读取栈顶1.6销毁栈❗1.7顺序栈c实例 2.共享栈2.1初始化2.2判满 1.顺序栈 用顺序存储实现的栈 顺序栈的缺点&#xff1a;栈的大小不可变。 #define MaxSize 10 //定义栈中元素的最大个数 typedef struct{ElemType data[…

IDEA 中如何通过连接数据库自动生成代码

目录 1、IDEA 中安装 MyBatisX 插件 2、点击 IDEA 右侧的 database 数据库按钮&#xff0c;点击新建数据源 Data Source 3、编辑数据库连接信息 4、选择你要生成代码的数据库表 5、编辑你代码生成的基本路径以及一些配置项 6、选择annotation&#xff1a;mybatis-plus3&a…

美国洛杉矶站群服务器如何提高网站排名?

美国洛杉矶站群服务器怎么样?美国洛杉矶站群服务器如何提高网站排名?Rak部落小编为您整理发布美国洛杉矶站群服务器如何提高网站排名? 美国洛杉矶站群服务器可以通过以下几种方式帮助提高网站排名&#xff1a; - **提升网站性能**&#xff1a;美国站群服务器通常配备高速CPU…

eclipse导入工程提示Project has no explicit encoding set

eclipse导入工程提示Project has no explicit encoding set 文章目录 eclipse导入工程提示Project has no explicit encoding set一、Eclipse的工程导入二、可能的问题1.在工程名下有黄色叹号 一、Eclipse的工程导入 用Eclipse的导入可以将原有工程导入到新环境中 具体方法是&…

phpstorm 设置变量,自动补全代码

效果 进入设置->实时模板->PHP->添加 添加动态模板->完善写法 定义->选择PHP->应用就行

OpenStack云计算(十四)——综合演练手动部署OpenStack,

本项目的项目实训可以完全参考教材配套讲解的详细步骤实施&#xff0c;总体来说实训工作量较大&#xff0c;可根据需要选做&#xff0c;重点观看配套的微课视频。 项目实训一 【实训题目】 搭建OpenStack云平台基础环境 【实训目的】 掌握OpenStack基础环境的安装和配置方…

mysql8.0免安装版windows

1.下载 MySQL下载链接 2.解压与新建my.ini文件 解压的路径最好不要有中文路径在\mysql-8.0.36-winx64文件夹下新建my.ini文件&#xff0c;不建data文件夹(会自动生成) [mysqld] # 设置3306端口 port3306 # 设置mysql的安装目录(尽量用双斜杠\\,单斜杠\可能会报错) basedirD:\…

如何在vue3+vite中优雅的使用iconify图标

前言 从Vue2迁移到Vue3&#xff0c;在使用上有着很大的差别。本文的话主要是针对图标的使用差别上进行分析&#xff0c;同时给出基于iconify图标库中unplugin-icons的用法。这里特殊说明一下&#xff1a;其实element-plus中用到的图标也是基于iconify图标库的&#xff0c;在我们…

mysql中join内外连接查询例子

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

好久没关注uCOS系统的消息了,全家桶免费后,竟一直以全新的名字Flexible Safety RTOS登场,且一直在更新

【视频版】 https://www.bilibili.com/video/BV1Kb421Y7v9 好久没关注uCOS系统的消息了&#xff0c;全家桶免费后&#xff0c;竟一直以全新的名字Flexible Safety RTOS登场&#xff0c;且一直在更新 【前言】 2020年初&#xff0c;uCOS全家桶宣布免费后&#xff0c;其Github上…

paddle ocr模型量化实践

参考&#xff1a;https://github.com/PaddlePaddle/PaddleOCR/blob/main/deploy/slim/quantization/README.md https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.7.1/doc/doc_ch/FAQ.md 蒸馏 剪枝 量化 参考&#xff1a;https://blog.csdn.net/mddCSDN/article/de…

医院手术室麻醉信息管理系统源码 自动生成麻醉的各种医疗文书(手术风险评估表、手术安全核查表)

目录 手术风险评估表 一、患者基本信息 二、既往病史 三、手术相关信息 四、风险评估因素 五、风险评估结果 手术安全核查表 一、患者身份与手术信息核对 二、术前准备核查 三、手术团队与职责确认 四、手术物品与设备核查 五、术中关键步骤核查 六、术后核查 七…

星融元加入超以太网联盟(UEC),推动智算网络创新实践

近日&#xff0c;星融元正式加入超以太网联盟(Ultra Ethernet Consortium,UEC)&#xff0c;该联盟是在 Linux 基金会的牵头下由多家全球头部科技企业联合成立&#xff0c;目标是突破传统以太网性能瓶颈&#xff0c;使其适用于人工智能&#xff08;AI&#xff09;和高性能计算&a…

Linux下基本指令-掌握

目录 为什么要学命令行 Linux下基本指令-掌握 ls 指令 pwd命令 cd 指令 touch指令 mkdir指令&#xff08;重要&#xff09;&#xff1a; rmdir指令 && rm 指令&#xff08;重要&#xff09;&#xff1a; man指令&#xff08;重要&#xff09;&#xff1a; cp指…

ARCGIS PRO3 三维模型OSGB转SLPK场景数据集

1.前言 因项目工作&#xff0c;需要将三维模型发布到arcgisserver上&#xff0c;但arcgisserver只支持slpk格式的模型&#xff0c;于是我开启了漫长的三维模型格式转换之旅&#xff0c;在这里记录下本人踩过的坑。 2.三维模型数据情况 2.1 模型大小&#xff1a;在20GB以上&a…

施耐德 Unity Pro 编程软件导入导出变量

适用范围 施耐德中高端PLC&#xff0c;使用的编程软件为 UnityPro &#xff08;最新版更名为 Ecostructure Control Expert&#xff09; 中端 PLC&#xff1a;Premium&#xff0c;M340高端 PLC&#xff1a;Quantum&#xff0c;M580 导出/导入变量 导出变量可导出【变量和 FB…

表演型人格的症状和起因,表演型人格测试和应对方法

都说人生不易&#xff0c;全靠演技&#xff0c;在生活这个大舞台上&#xff0c;每个人都在诠释自己的角色&#xff0c;在不同的人面前展现出了不一样的形象。面对父母&#xff0c;面对孩子&#xff0c;面对老板&#xff0c;面对同事&#xff0c;面对朋友&#xff0c;他们好像有…