网盘——分享文件——逻辑设计

本文主要讲解关于网盘文件操作部分的分享文件的逻辑设计部分,主要步骤如下:

目录

1、实施步骤:

2、代码实现

2.1、添加分享文件协议

2.2、添加取消槽函数

2.3、关联取消选择的槽函数

2.4、添加取消槽函数的定义

2.5、添加全选函数槽函数

2.6、关联全选槽函数

2.7、添加全部选择槽函数的定义

2.8、确定取消分享按钮

2.9、关联槽函数

2.10、在共享文件函数部分获得文件名

2.11、添加确定分享文件的定义

2.12、服务器端添加接收分享文件case

2.13、在客户端添加通知信息的处理

2.14、服务器添加通知回复的case

2.15、取消分享文件,先把它隐藏起来

2.16、文件夹的分享

2.17、添加定义

2.18、在case中调用

2.19、测试文件夹的分享

A、用户登录,刷新好友

B、点击图书,刷新文件,共享文件,选择Lucy好友,确定

C、点击yes

D、刷新lucy文件

E、查看文件是否真正创建


1、实施步骤:

A、客户端发送分享文件请求(请求包含分享者、接收者、当前路径以及文件名)

那么PDU应该如何设置呢?分享者放在cadata里面,接收者放在camsg里面,当前路径也是camsg,那都放在一起了,如何做区分呢?将分享者和接收者的个数放在cadata里面,文件名也放在camsg或者将当前路径和文件名拼接,一起放在msg里面。

B、服务器端接收请求,对请求进行操作,并将操作结果返回给客户端

C、客户端接收回复信息并显示

2、代码实现

2.1、添加分享文件协议

    
    ENUM_MSG_TYPE_SHARE_FILE_REQUEST,  //分享文件请求
    ENUM_MSG_TYPE_SHARE_FILE_RESPOND,  //分享文件回复

2.2、添加取消槽函数

    //添加分享文件槽函数
    void cancleSelect();//取消选择

2.3、关联取消选择的槽函数

    //关联取消选择信号槽
    connect(m_pCancelSelectPB,SIGNAL(clicked(bool))
            ,this, SLOT(cancleSelect()));

2.4、添加取消槽函数的定义

void ShareFile::cancleSelect()
{
    //获得选择的checkbox
     QList<QAbstractButton*> cbList = m_pButtonGroup->buttons();
     //循环遍历list
     for(int i=0; i<cbList.size(); i++)
     {
         if(cbList[i]->isChecked())
         {
             cbList[i]->setChecked(false);
         }
     }
}

测试

点击取消选择

2.5、添加全选函数槽函数

    void allSelect();//全部选择

2.6、关联全选槽函数

    //关联全部选择信号槽
    connect(m_pSelectAllPB,SIGNAL(clicked(bool))
            ,this, SLOT(allSelect()));

2.7、添加全部选择槽函数的定义

//分享文件全选
void ShareFile::allSelect()
{
    //获得选择的checkbox
     QList<QAbstractButton*> cbList = m_pButtonGroup->buttons();
     //循环遍历list
     for(int i=0; i<cbList.size(); i++)
     {
         if(!cbList[i]->isChecked())
         {
             cbList[i]->setChecked(true);
         }
     }
}

测试

2.8、确定取消分享按钮

    void okShare(); //确定分享
    void cancleShare();//取消分享

2.9、关联槽函数

    //关联确定分享信号槽
    connect(m_pOKPB,SIGNAL(clicked(bool))
            ,this, SLOT(okShare()));
    
    //关联取消分享信号槽
    connect(m_pCancelPB,SIGNAL(clicked(bool))
            ,this, SLOT(cancleShare()));

2.10、在共享文件函数部分获得文件名

void Book::shareFile()
{
    //获得点击删除的文件
    QListWidgetItem *pItem =  m_pBookListW->currentItem();
    //判断
    if(NULL==pItem)
    {
        QMessageBox::warning(this,"分享文件","请选择分享的文件");
        return;
    }
    else
    {//获得分享的文件名
        //文件名字
        m_strShareFileName = pItem->text();        
    }
    //获得好友列表
    Friend *pFriend = OpeWidget::getInstance().getFriend();
    QListWidget *pFriendList = pFriend->getFriendlist();
    ShareFile::getinstance().updateFriend(pFriendList);
    if(ShareFile::getinstance().isHidden())
    {
        ShareFile::getinstance().show();
    }
}

2.11、添加确定分享文件的定义

//确定分享文件
void ShareFile::okShare()
{
    //谁分享的
    QString strName =  TcpClient::getinstance().loginName();
    //当前的路径
    QString strCurPath = TcpClient::getinstance().curPath();
    //获得共享的文件名
    QString strShareFileName = OpeWidget::getInstance().getBook()->getShowFileName();

    QString strPath = strCurPath +"/"+strShareFileName;

    //获得接收者
    //获得选择的checkbox
    QList<QAbstractButton*> cbList = m_pButtonGroup->buttons();
    int num =0;
    //循环遍历list
    for(int i=0; i<cbList.size(); i++)
    {
        if(cbList[i]->isChecked())
        {
            num++;
        }
    }
    PDU *pdu = mkPDU(32*num+strPath.size()+1);
    pdu->uiMsgType = ENUM_MSG_TYPE_SHARE_FILE_REQUEST;
    sprintf(pdu->caData, "%s %d", strName.toStdString().c_str(),num);
    int j =0;
    for(int i=0;i<cbList.size();i++)
    {
        if(cbList[i]->isChecked())
        {
            memcpy((char*)(pdu->caMsg)+j*32, cbList[i]->text().toStdString().c_str(), cbList[i]->text().size());
            j++;
        }
    }
    //将路径拷贝进去
    memcpy((char*)(pdu->caMsg)+num*32, strPath.toStdString().c_str(), strPath.size());

    TcpClient::getinstance().getTcpSocket().write((char*)pdu, pdu->uiPDULen);
    free(pdu);
    pdu=NULL;
}

2.12、服务器端添加接收分享文件case

  case ENUM_MSG_TYPE_SHARE_FILE_REQUEST:
        {
            char caSendName[32] = {'\0'};
            int num = 0;
            sscanf(pdu->caData, "%s%d", caSendName, &num);
            int size = num*32;
            PDU  *respdu = mkPDU(pdu->uiMsgLen-size);
            respdu->uiMsgType =ENUM_MSG_TYPE_SHARE_FILE_NOTE;
            strcpy(respdu->caData,caSendName);
            memcpy(respdu->caMsg, (char*)(pdu->caMsg)+size, pdu->uiMsgLen-size);
            //通知给谁
            char caReceName[32] = {'\0'};
            for(int i=0;i<num;i++)
            {
                memcpy(caReceName, (char*)(pdu->caMsg)+i*32, 32);
                MyTcpServer::getInstance().reSend(caReceName, respdu);
            }
            free(respdu);
            respdu=NULL;

            respdu=mkPDU(0);
            respdu->uiMsgType = ENUM_MSG_TYPE_SHARE_FILE_RESPOND;
            strcpy(respdu->caData, SHARE_FILE_OK);
            write((char*)respdu, respdu->uiPDULen);

            free(respdu);
            respdu=NULL;

            break;
        }

2.13、在客户端添加通知信息的处理

            //---------------------分享文件------------------------
        case ENUM_MSG_TYPE_SHARE_FILE_RESPOND:
        {
            QMessageBox::information(this,"共享文件",pdu->caData);
            break;
        }
        case ENUM_MSG_TYPE_SHARE_FILE_NOTE:
        {
            //是否接收对方共享的文件
            char *pPath = new char[pdu->uiMsgLen];
            memcpy(pPath, pdu->caMsg,pdu->uiMsgLen);
            // //aa//bb/cc
            char *pos =  strrchr(pPath, '/');
            qDebug()<<pos;
            if(NULL != pos)
            {//表示找到了
                pos++;
                QString strNote = QString("%1 share file->%2 \n Do you accept?").arg(pdu->caData).arg(pos);
                int ret = QMessageBox::information(this,"共享文件",strNote);
                if(QMessageBox::Yes==ret)
                {
                    PDU *respdu = mkPDU(pdu->uiMsgLen);
                    respdu->uiMsgType =ENUM_MSG_TYPE_SHARE_FILE_NOTE_RESPOND;
                    memcpy(respdu->caMsg, pdu->caMsg,pdu->uiMsgLen);
                    //接收者名字
                    QString strName = TcpClient::getinstance().loginName();
                    strcpy(respdu->caData,strName.toStdString().c_str());
                    m_tcpSocket.write((char*)respdu, respdu->uiPDULen);
                }
            }
            break;
        }

2.14、服务器添加通知回复的case

        case ENUM_MSG_TYPE_SHARE_FILE_NOTE_RESPOND:
        {
            QString strRecvPath = QString("./%1").arg(pdu->caData);
            //共享者文件路径
            QString strShareFilePath = QString("%1").arg((char*)(pdu->caMsg));

            //拼接名字
            int index = strShareFilePath.lastIndexOf('/');
            QString strFileName = strShareFilePath.right(strShareFilePath.size()-index-1);
            strRecvPath =strRecvPath +'/' +strFileName;

            //拷贝文件
            QFileInfo fileinfo(strShareFilePath);
            if(fileinfo.isFile())
            {
                QFile::copy(strShareFilePath,strRecvPath);
            }
            else  if(fileinfo.isDir())
            {

            }
            break;
        }

测试 登录jack和lucy这两个好友,刷新jack的文件,将test.txt文件发送给lucy,弹出窗口提示之后,刷新lucy文件,发现分享文件成功

成功

2.15、取消分享文件,先把它隐藏起来

//取消分享文件
void ShareFile::cancleShare()
{
    hide();
}

2.16、文件夹的分享

 //分享文件——文件夹的拷贝
    void copyDir(QString strSrcDir, QString strDestDir);

2.17、添加定义

void MyTcpSocket::copyDir(QString strSrcDir, QString strDestDir)
{
    //创建目标文件
    QDir dir;
    dir.mkdir(strDestDir);//产生一个目录
    //打开原来要拷贝的目录
    dir.setPath(strSrcDir);
    QFileInfoList fileInfoList =  dir.entryInfoList();
    QString srcTmp;
    QString destTmp;
    //遍历list
    for(int i=0;i<fileInfoList.size();i++)
    {
        if(fileInfoList[i].isFile())
        {//如果是常规文件            
            qDebug()<<"filename:"<<fileInfoList[i].fileName();
            srcTmp = strSrcDir + '/' +fileInfoList[i].fileName();
            destTmp = strDestDir + '/' +fileInfoList[i].fileName();
            QFile::copy(srcTmp,destTmp);
        }
        else if (fileInfoList[i].isDir()) {
            if(QString(".") == fileInfoList[i].fileName()||QString("..") == fileInfoList[i].fileName())
            {
                continue;
            }
            srcTmp = strSrcDir + '/' +fileInfoList[i].fileName();
            destTmp = strDestDir + '/' +fileInfoList[i].fileName();
            copyDir(srcTmp,destTmp);//如果是子文件夹,递归进行拷贝
        }
    }
}

2.18、在case中调用

 case ENUM_MSG_TYPE_SHARE_FILE_NOTE_RESPOND:
        {
            QString strRecvPath = QString("./%1").arg(pdu->caData);
            //共享者文件路径
            QString strShareFilePath = QString("%1").arg((char*)(pdu->caMsg));
            
            //拼接名字
            int index = strShareFilePath.lastIndexOf('/');
            QString strFileName = strShareFilePath.right(strShareFilePath.size()-index-1);
            strRecvPath =strRecvPath +'/' +strFileName;
            //拷贝文件
            QFileInfo fileinfo(strShareFilePath);
            if(fileinfo.isFile())
            {
                QFile::copy(strShareFilePath,strRecvPath);
            }
            else if(fileinfo.isDir())
            {
                copyDir(strShareFilePath,strRecvPath);
            }
            break;
        }

2.19、测试文件夹的分享

A、用户登录,刷新好友

B、点击图书,刷新文件,共享文件,选择Lucy好友,确定

C、点击yes

D、刷新lucy文件

E、查看文件是否真正创建

测试成功 

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

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

相关文章

小程序地理位置接口权限直接抄作业

小程序地理位置接口有什么功能&#xff1f; 随着小程序生态的发展&#xff0c;越来越多的小程序开发者会通过官方提供的自带接口来给用户提供便捷的服务。但是当涉及到地理位置接口时&#xff0c;却经常遇到申请驳回的问题&#xff0c;反复修改也无法通过&#xff0c;给的理由也…

rabbitMq 0 到1

前言 工作中MQ的使用场景是数不胜数&#xff0c;每个公司的技术选型又不太一样&#xff0c;用的哪个MQ&#xff0c;我们必须要先玩起来&#xff0c;RabbitMQ在windows安装遇到很多问题&#xff0c;博客也是五花八门&#xff0c;算了还是自己搞吧&#xff0c;记录一下&#xff…

C#描述-计算机视觉OpenCV(3):重映射

C#描述-计算机视觉OpenCV&#xff08;3&#xff09;&#xff1a;重映射 前言色彩波形图像重映射 前言 C#描述-计算机视觉OpenCV&#xff08;1&#xff09;&#xff1a;基础操作 C#描述-计算机视觉OpenCV&#xff08;2&#xff09;&#xff1a;图像处理 在前文中&#xff0c;描…

2.2 Java全栈开发前端+后端(全栈工程师进阶之路)-前端框架VUE3-基础-Vue基本语法

文本渲染指令 文本渲染指令-v-html与v-text Vue使用了基于HTML的模板语法&#xff0c;允许开发者声明式地将DOM绑定至底层Vue实例的数据。所有Vue的模板都是 合法的HTML&#xff0c;所以能被遵循规范的浏览器和HTML解析器解析。 在前面&#xff0c;我们一直使用的是字符串插…

探索科技园区的创新应用架构

在当今科技快速发展的时代&#xff0c;科技园区已经成为了创新和技术发展的孵化器和聚集地。在这样的环境中&#xff0c;科技园区的应用架构扮演着至关重要的角色&#xff0c;它不仅需要支持各种创新型企业和科技项目的发展&#xff0c;还需要提供高效的技术基础设施和服务。下…

python 11Pandas数据可视化实验

实验目的&#xff1a; 学会使用Pandas操作数据集&#xff0c;并进行可视化。 数据集描述&#xff1a; 该数据集是CNKI中与“中药毒理反应”相关的文献信息&#xff0c;包含文章题目、作者、来源&#xff08;出版社&#xff09;、摘要、发表时间等信息。 实验要求&#xff1…

ubuntu外置网卡配置AP模式

外置网卡RTL8811CU设置 UBUNTU使用RTL8811CU网卡&#xff08;包含树莓派&#xff09; 外置网卡配置AP模式流程 1. 检查网卡支持情况&#xff08;是否支持AP模式&#xff09; iw list找到以上部分&#xff0c;发现支持AP 2. 安装依赖 sudo apt-get update sudo apt-get in…

39 死锁

目录 1.死锁 2.线程同步 3.条件变量 4.案例 死锁 概念 死锁是指在一组进程中的各个进程均占有不会释放的资源&#xff0c;但因互相申请被其他进程所占用不会释放的资源而处于的一种永久等待状态 四个必要条件 互斥条件&#xff1a;一个资源每次只能被一个执行流使用 请求…

MFC 列表控件修改实例(源码下载)

1、本程序基于前期我的博客文章《MFC下拉菜单打钩图标存取实例&#xff08;源码下载&#xff09;》 2、程序功能选中列表控件某一项&#xff0c;修改这一项的按钮由禁止变为可用&#xff0c;双击这个按钮弹出对话框可对这一项的记录数据进行修改&#xff0c;点击确定保存修改数…

SpirngBoot整合快递100

目录 一、注册快递100 二、技术文档地址 三、需要认证的key和comcumer 四、spring boot 整合快递 100使用 4.1 引入快递100和hutool的依赖 4.2 将key和comcumer写入application.properties文件中 4.3 新建一个modle,用于将查出来的json数据转成对象 4.4 新建一个controll…

golang 基础知识细节回顾

之前学习golang的速度过于快&#xff0c;部分内容有点囫囵吞枣的感觉&#xff0c;写gorm过程中有很多违反我常识的地方&#xff0c;我通过复习去修正了我之前认知错误和遗漏的地方。 itoa itoa自增的作用在编辑error code时候作用很大&#xff0c;之前编辑springboot的error c…

python从0开始学习

目录 前言 1、print函数 2、input函数 3、保留字和标识符 总结 前言 本篇文章我们开辟一个新的学习模块&#xff1a;python。python是一个十分简洁实用的编程语言&#xff0c;我们将从0开始学习python 1、print函数 print(*args, sep , end\n, fileNone, flushFalse) pytho…

2024五一数学建模C题煤矿深部开采冲击地压危险预测原创论文分享

大家好&#xff0c;从昨天肝到现在&#xff0c;终于完成了2024五一数学建模竞赛C题的完整论文啦。 实在精力有限&#xff0c;具体的讲解大家可以去讲解视频&#xff1a; 2024五一数学建模C题完整原创论文讲解&#xff0c;手把手保姆级教学&#xff01;_哔哩哔哩_bilibili 202…

[1678]旅游景点信息Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 旅游景点信息管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql…

在idea中连接mysql

IDE&#xff08;集成开发环境&#xff09;是一种软件应用程序&#xff0c;它为开发者提供编程语言的开发环境&#xff0c;通常集成了编码、编译、调试和运行程序的多种功能。一个好的IDE可以大幅提高开发效率&#xff0c;尤其是在进行大型项目开发时。IDE通常包括以下几个核心组…

酒水门店私域流量运营搭建执行规划方案

【干货资料持续更新&#xff0c;以防走丢】 酒水门店私域流量运营搭建执行规划方案 部分资料预览 资料部分是网络整理&#xff0c;仅供学习参考。 PPT可编辑&#xff08;完整资料包含以下内容&#xff09; 目录 精酿啤酒品牌私域执行运营的内容策划&#xff0c;涉及以下几个…

在做题中学习(48):朴素的二分查找

. - 力扣&#xff08;LeetCode&#xff09; 解法一&#xff1a; 暴力求解 for循环中&#xff0c;从nums[0]枚举到nums[n-1]&#xff0c;依次判断&#xff0c;返回 target的值。 时间复杂度 : O(N) :因为要遍历一遍数组 解法二&#xff1a;二分查找 因为此数组为有序的…

利用Github发现优质的学习项目网址

1. 直接搜索&#xff0c;star的数量越多的项目质量越高 2.Github Trending 地址: https://github.com/trending 3. Gitstar Ranking 地址: https://gistar-ranking.com/ 4. Awesome Topic 地址: https://github.com/topics/awesome

FIFO Generate IP核使用——Data Counts页详解

在Vivado IDE中&#xff0c;当看到一个用于设置数据计数选项的选项卡时&#xff0c;需要注意的是&#xff0c;尽管某些选项值可能因为当前的配置而显示为灰色&#xff08;即不可选或已禁用&#xff09;&#xff0c;但IDE中显示的有效范围值实际上是你可以选择的真实值。即使某些…

静态库、动态库回顾

回顾一下库相关的知识点&#xff0c;总结备忘一下。在某种情况下&#xff0c;你有了如下的代码&#xff0c;结构如下 //pra.h #include <stdio.h> void test_01(); //pra.c #include "pra.h" void test_01() {printf("xxxxxxx----->%s %s()\n",…
最新文章