[云盘]共享文件列表

博客主要介绍了处理共享文件列表的过程,包括变量定义、读取配置文件、解析前端Json和文件下载标志处理。重点讲解了如何从cfg.json中读取MySQL和Redis的配置,并在用户下载文件时更新数据库的pv字段,以及利用Redis维护下载排行榜。
摘要由CSDN通过智能技术生成

变量定义

  • DEALSHAREFILE_LOG_MODULE—日志模块的输出到该模块

  • DEALSHAREFILE_LOG_PROC —该日志模块输出的具体目录

  • 定义三个static静态字符数组存放MySQL登录用户名密码和具体使用的数据库

  • 定义两个static静态数组存放Redis的ip+port

  • 根据以上定义判断MySQL采用本地连接,Redis采用远程连接

      #define DEALSHAREFILE_LOG_MODULE       "cgi"
      #define DEALSHAREFILE_LOG_PROC         "dealsharefile"
      
      //mysql 数据库配置信息 用户名, 密码, 数据库名称
      static char mysql_user[128] = {0};
      static char mysql_pwd[128] = {0};
      static char mysql_db[128] = {0};
      
      //redis 服务器ip、端口
      static char redis_ip[30] = {0};
      static char redis_port[10] = {0};
    

读取配置文件

  • 定义该函数用于读取配置文件中的参数包括MySQL和Redis已经做日志输出

      void read_cfg()
      {
          //读取mysql数据库配置信息
          get_cfg_value(CFG_PATH, "mysql", "user", mysql_user);
          get_cfg_value(CFG_PATH, "mysql", "password", mysql_pwd);
          get_cfg_value(CFG_PATH, "mysql", "database", mysql_db);
          LOG(DEALSHAREFILE_LOG_MODULE, DEALSHAREFILE_LOG_PROC, "mysql:[user=%s,pwd=%s,database=%s]", mysql_user, mysql_pwd, mysql_db);
      
          //读取redis配置信息
          get_cfg_value(CFG_PATH, "redis", "ip", redis_ip);
          get_cfg_value(CFG_PATH, "redis", "port", redis_port);
          LOG(DEALSHAREFILE_LOG_MODULE, DEALSHAREFILE_LOG_PROC, "redis:[ip=%s,port=%s]\n", redis_ip, redis_port);
      }
    

cfg.h

  • #define CFG_PATH “./conf/cfg.json” //配置文件路径,说明MySQL和Redis的配置信息放放到当前目录上一级下的conf/cfg.json中

      #ifndef _CFG_H_
      #define _CFG_H_
      
      #define CFG_PATH    "./conf/cfg.json" //配置文件路径
      
      #define CFG_LOG_MODULE "cgi"
      #define CFG_LOG_PROC   "cfg"
      
      /* -------------------------------------------*/
      /**
       * @brief  从配置文件中得到相对应的参数
       *
       * @param profile   配置文件路径
       * @param tile      配置文件title名称[title]
       * @param key       key
       * @param value    (out)  得到的value
       *
       * @returns
       *      0 succ, -1 fail
       */
      /* -------------------------------------------*/
      extern int get_cfg_value(const char *profile, char *tile, char *key, char *value);
      
      //获取数据库用户名、用户密码、数据库标示等信息
      extern int get_mysql_info(char *mysql_user, char *mysql_pwd, char *mysql_db);
      #endif
    
  • extern关键字可以用来声明变量和函数作为外部变量或者函数供其它文件使用

  • extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这部分代码按C语言的进行编译,而不是C++的

cfg.c

	 #include <stdlib.h>
	 #include <string.h>
	 #include "make_log.h"
	 #include "cfg.h"
	 #include "cJSON.h"
	
	/* -------------------------------------------*/
	/**
	 * @brief  从配置文件中得到相对应的参数
	 *
	 * @param profile   配置文件路径
	 * @param title      配置文件title名称[title]
	 * @param key       key
	 * @param value    (out)  得到的value
	 *
	 * @returns
	 *      0 succ, -1 fail
	 */
	/* -------------------------------------------*/
	int get_cfg_value(const char *profile, char *title, char *key, char *value)
	{
	    int ret = 0;
	    char *buf = NULL;
	    FILE *fp = NULL;
	
	    //异常处理
	    if(profile == NULL || title == NULL || key == NULL || value == NULL)
	    {
	        return -1;
	    }
	
	    //只读方式打开文件
	    fp = fopen(profile, "rb");
	    if(fp == NULL) //打开失败
	    {
	        perror("fopen");
	        LOG(CFG_LOG_MODULE, CFG_LOG_PROC, "fopen err\n");
	        ret = -1;
	        goto END;
	    }
	
	    fseek(fp, 0, SEEK_END);//光标移动到末尾
	    long size = ftell(fp); //获取文件大小
	    fseek(fp, 0, SEEK_SET);//光标移动到开头
	
	
	    buf = (char *)calloc(1, size+1); //动态分配空间
	    if(buf == NULL)
	    {
	        perror("calloc");
	        LOG(CFG_LOG_MODULE, CFG_LOG_PROC, "calloc err\n");
	        ret = -1;
	        goto END;
	    }
	
	    //读取文件内容
	    fread(buf, 1, size, fp);
	
	    //解析一个json字符串为cJSON对象
	    cJSON * root = cJSON_Parse(buf);
	    if(NULL == root)
	    {
	        LOG(CFG_LOG_MODULE, CFG_LOG_PROC, "root err\n");
	        ret = -1;
	        goto END;
	    }
	
	    //返回指定字符串对应的json对象
	    cJSON * father = cJSON_GetObjectItem(root, title);
	    if(NULL == father)
	    {
	        LOG(CFG_LOG_MODULE, CFG_LOG_PROC, "father err\n");
	        ret = -1;
	        goto END;
	    }
	
	    cJSON * son = cJSON_GetObjectItem(father, key);
	    if(NULL == son)
	    {
	        LOG(CFG_LOG_MODULE, CFG_LOG_PROC, "son err\n");
	        ret = -1;
	        goto END;
	    }
	
	    //LOG(CFG_LOG_MODULE, CFG_LOG_PROC, "son->valuestring = %s\n", son->valuestring);
	    strcpy(value, son->valuestring); //拷贝内容
	
	    cJSON_Delete(root);//删除json对象
	
	END:
	    if(fp != NULL)
	    {
	        fclose(fp);
	    }
	
	    if(buf != NULL)
	    {
	        free(buf);
	    }
	
	    return ret;
	}
	
	
	//获取数据库用户名、用户密码、数据库标示等信息
	int get_mysql_info(char *mysql_user, char *mysql_pwd, char *mysql_db)
	{
	    if( -1 == get_cfg_value(CFG_PATH, "mysql", "user", mysql_user) )
	    {
	        LOG(CFG_LOG_MODULE, CFG_LOG_PROC, "mysql_user err\n");
	        return -1;
	    }
	
	    if( -1 == get_cfg_value(CFG_PATH, "mysql", "password", mysql_pwd) )
	    {
	        LOG(CFG_LOG_MODULE, CFG_LOG_PROC, "mysql_pwd err\n");
	        return -1;
	    }
	
	    if( -1 == get_cfg_value(CFG_PATH, "mysql", "database", mysql_db) )
	    {
	        LOG(CFG_LOG_MODULE, CFG_LOG_PROC, "mysql_db err\n");
	        return -1;
	    }
	
	    return 0;
	}

/conf

  • /conf目录如下所示,其中redis.conf是配合redis使用的文件而没有具体的ip+port
    在这里插入图片描述

  • 项目部署时,需要先将MySQL和Redis的连接配置信息写入cfg.json中

在这里插入图片描述

解析前端Json

  • 前端QT点击共享文件,则会显示共享文件列表

  • 解析json包(user,md5,filename),拿到用户名,文件md5码,文件名字

      //解析的json包
      int get_json_info(char *buf, char *user, char *md5, char *filename)
      {
          int ret = 0;
      
      /*json数据如下
      {
      "user": "yoyo",
      "md5": "xxx",
      "filename": "xxx"
      }
      */
    
      //解析json包
      //解析一个json字符串为cJSON对象
      cJSON * root = cJSON_Parse(buf);
      if(NULL == root)
      {
          LOG(DEALSHAREFILE_LOG_MODULE, DEALSHAREFILE_LOG_PROC, "cJSON_Parse err\n");
          ret 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值