网盘——进入文件夹

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

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.mfbz.cn/a/577239.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot---------整合Redis

目录 第一步&#xff1a;引入依赖 第二步&#xff1a;配置Redis信息 第三步&#xff1a;选择Spring Data Redis进行操作Redis数据库 ①操作String类型数据&#xff08;用的少&#xff09; ②操作Object类型数据&#xff08;重要&#xff01;&#xff01;&#xff01;&#x…

mac安装java

在 macOS 上配置 Java 环境变量是相对简单的。你需要做的是设置 JAVA_HOME 环境变量&#xff0c;并将 bin 目录添加到 PATH 变量中。本篇是最详细的教程&#xff0c;细化每个步骤过程&#xff0c;保姆级的教程&#xff01; 1. 下载JDK安装包 到oracle官网下载适合的JDK安装包…

阿里巴巴瓴羊基于 Flink 实时计算的优化和实践

摘要&#xff1a;本⽂整理⾃阿里云智能集团技术专家王柳焮⽼师在 Flink Forward Asia 2023 中平台建设专场的分享。内容主要为以下四部分&#xff1a; 阿里巴巴瓴羊基于 Flink 实时计算的平台演进Flink 能力优化与建设基于 Flink 的最佳实践未来规划 1. 阿里巴巴瓴羊基于 Flink…

低代码信创开发核心技术(四)动态元数据系统设计

一、概述 在当今快速发展的信息技术领域&#xff0c;动态元数据系统扮演着至关重要的角色。它不仅能够提供数据的描述信息&#xff0c;还能动态地适应业务需求的变化&#xff0c;从而提高系统的灵活性和可扩展性。构建一个动态元数据系统意味着我们可以在不重启系统的情况下&a…

代码随想录算法训练营第三十八天|动态规划理论基础、509.斐波那契数、70.爬楼梯、746.使用最小花费爬楼梯

动态规划理论基础 1.什么是动态规划&#xff1a; 动态规划&#xff0c;英文&#xff1a;Dynamic Programming&#xff0c;简称DP&#xff0c;如果某一问题有很多重叠子问题&#xff0c;使用动态规划是最有效的。 所以动态规划中每一个状态一定是由上一个状态推导出来的&…

buuctf re 45-48

[BJDCTF2020]BJD hamburger competition 参考&#xff1a;http://t.csdnimg.cn/cJOSi 参考&#xff1a;http://t.csdnimg.cn/g9dA7 这是一堆&#xff0c;仔细看&#xff0c;是个游戏 安装ILSPY 下载失败 思路还是比较简单的 对所给进行sha1解密&#xff0c;在进行md5加密…

Vuforia AR篇(四)— AR虚拟按钮

目录 前言一、创建虚拟按钮二、创建脚本三、效果 前言 在当今互联网和移动设备普及的背景下&#xff0c;**增强现实&#xff08;AR&#xff09;**技术正迅速成为连接现实世界与数字信息的重要桥梁。AR虚拟按钮作为这一技术的创新应用&#xff0c;不仅提供了一种全新的用户交互…

智能穿戴终端设备安卓主板方案_MTK平台智能手表PCBA定制开发

新移科技智能手表方案兼容WiFi、BLE、2~5G等多种通信能力。支持多个功能模块&#xff0c;包括&#xff1a;通话、计步、定位、睡眠监测、心率监测、血氧监测等。智能手表通过滑动与功能性按键提供高度直观的体验感受&#xff0c;从腕间即可掌控日常生活。形态支持定制包括&…

线性代数 --- 计算斐波那契数列第n项的快速算法(矩阵的n次幂)

计算斐波那契数列第n项的快速算法(矩阵的n次幂) The n-th term of Fibonacci Numbers&#xff1a; 斐波那契数列的是一个古老而又经典的数学数列&#xff0c;距今已经有800多年了。关于斐波那契数列的计算方法不难&#xff0c;只是当我们希望快速求出其数列中的第100&#xff0…

关于SSL加密,您应该知道什么?

SSL加密&#xff0c;全称为安全套接字层加密&#xff0c;是一种网络安全协议&#xff0c;主要用于在网络通信中提供隐私和数据完整性。它通过在客户端和服务器之间建立一个加密的通道&#xff0c;确保数据在传输过程中不被窃取或篡改。随着互联网的普及和电子商务的快速发展&am…

边OTG边充电芯片LDR6500

随着科技的飞速发展&#xff0c;智能移动设备已成为我们生活中不可或缺的一部分。而在这些设备的连接与数据传输中&#xff0c;Type-C接口以其高效、便捷的特性逐渐占据了主导地位。OTG&#xff08;On-The-Go&#xff09;技术则进一步扩展了Type-C接口的功能&#xff0c;使得设…

uniapp 微信小程序 获取openid,手机号进行登录,配合后端

流程&#xff1a;登录注册功能,通过uni.getUserProfile获取wxcode,通过wxcode传给后端获取openid,sessionkey,unionid。 通过<u-button type"success" open-type"getPhoneNumber" getphonenumber"decryptPhoneNumber">一键登录</u-butt…

Spark-机器学习(5)分类学习之朴素贝叶斯算法

在之前的文章中&#xff0c;我们学习了回归中的逻辑回归&#xff0c;并带来简单案例&#xff0c;学习用法&#xff0c;并带来了简单案例。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵…

合合信息引领AI场景化革新,供应链金融智能化审核全面升级!

官.网地址&#xff1a;合合TextIn - 合合信息旗下OCR云服务产品 随着供给侧结构性改革的深入推进和产业结构的不断升级&#xff0c;金融机构在监管部门的指导下&#xff0c;积极拓展供应链金融业务&#xff0c;取得了显著成效。这一举措有效缓解了上下游中小企业的融资困难&a…

你的网站还在使用HTTP? 免费升级至HTTPS吧

如果您的网站还在使用老的http协议&#xff0c;可以申请一个免费的SSL证书升级至https&#xff01; 具体步骤如下&#xff1a; 1 申请免费SSL证书 根据你的需求选择合适的SSL证书类型&#xff0c;如单域名证书&#xff0c;多域名证书、通配符证书 登录免费供应商JoySSL官网&…

中电金信:深度解析|数字化营销运营体系搭建

如何更好更快地梳理好体系搭建思路&#xff0c;稳步实现落地&#xff1f;下文将为大家明确搭建的推进步骤、执行要点&#xff0c;帮助商业银行理顺数字化营销运营体系的“点”“线”“面”~ 与所有转型的曲折、阵痛等特征一样&#xff0c;商业银行构建数字化营销运营体系过程中…

数据结构与算法解题-20240426

这里写目录标题 面试题 08.04. 幂集367. 有效的完全平方数192. 统计词频747. 至少是其他数字两倍的最大数718. 最长重复子数组 面试题 08.04. 幂集 中等 幂集。编写一种方法&#xff0c;返回某集合的所有子集。集合中不包含重复的元素。 说明&#xff1a;解集不能包含重复的子…

DSP开发实战教程--EPWM模块的影子寄存器详细讲解原理和代码实例

EPWM模块影子寄存器的原理 在TI&#xff08;Texas Instruments&#xff09;的DSP28335中&#xff0c;EPWM&#xff08;Enhanced Pulse Width Modulator&#xff09;模块提供了高精度、高灵活性的PWM信号生成功能。为了能在不影响当前PWM波形输出的情况下预装载新的PWM参数&…

电源小白入门学习6——锂离子电池特性及充电电路

锂离子电池特性及充电电路 锂离子电池18650电池锂聚合物电池锂电池的放电曲线 锂离子电池充电方法常见的充电方案 锂离子电池 锂离子电池是一种常见的可充电电池类型&#xff0c;主要依靠锂离子在正极和负极之间的移动来工作。在充放电过程中&#xff0c;锂离子在两个电极之间…

表情识别 | LBP+SVM实现脸部动态特征的人脸表情识别程序(Matlab)

表情识别 | LBPSVM实现脸部动态特征的人脸表情识别程序&#xff08;Matlab&#xff09; 目录 表情识别 | LBPSVM实现脸部动态特征的人脸表情识别程序&#xff08;Matlab&#xff09;预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1 运行环境 程序运行在Windows系统下&am…