CA系统(file.h---申请认证的处理)

news2024/11/29 7:19:53
#pragma once
#ifndef FILEMANAGER_H
#define FILEMANAGER_H
#include <string>
namespace F_ile
{
 // 读取文件,返回文件内容
    bool readFilename(const std::string& filePath);
    bool readFilePubilcpath(const std::string& filePath);
    bool getNameFromFile(const std::string& filePath);
    bool combineFilesToNewFile(const std::string& txtFilePath, const std::string& pemFilePath);
    // 保存文本到文件
    void saveFile(const std::string& filePath, const std::string& text);

    // 删除文件
   void deleteFile(const std::string& filePath);


}
#endif // FILEMANAGER_H

#include "pch.h"
#include "file.h"
#include <fstream>
#include <iostream>
#include <cstdio>
#include <string>
#include <stdexcept>
#include <regex>// 引入异常处理
#include <sstream>
#include <filesystem>  
#include <stdexcept>
#include <iomanip>
#include <vector>
#include <bitset>
#include "SHA256.h"
namespace F_ile 
{

    // 读取文件内容
    bool readFilename(const std::string& filePath) {
        std::ifstream file(filePath);
        if (!file.is_open()) {
            MessageBox(0,TEXT("Error opening file."), TEXT("Error"), MB_OK | MB_ICONERROR);
            return false;
        }

        // 定义我们需要匹配的四个字段的正则表达式
        std::regex expectedPattern(R"(^\s*(name|phone|email|room)\s*:.*$)"); // 匹配 "姓名:"、"手机号:"、"邮箱:"、"班级:"
        std::string line;

        // 逐行读取文件内容并检查格式
        while (std::getline(file, line)) {
            // 如果当前行不符合预期的格式
            if (!std::regex_match(line, expectedPattern)) {
                MessageBox(0, TEXT(" opening file."), TEXT("WRONG"), MB_OK | MB_ICONERROR);
                file.close();
                return false;  // 如果有任何一行不匹配格式,返回 false
            }
        }
        
        file.close();
        return true;  // 所有行都匹配格式,返回 true
    }

    bool readFilePubilcpath(const std::string& filePath) {
        std::ifstream file(filePath);

        // 检查文件是否成功打开
        if (!file.is_open()) {
            MessageBox(0, TEXT("Error opening file."), TEXT("Error"), MB_OK | MB_ICONERROR);
            return false;
        }

        // 读取文件内容
        std::string line;
        bool hasBegin = false;
        bool hasEnd = false;

        // 查找 "-----BEGIN" 和 "-----END" 标识符
        while (std::getline(file, line)) {
            // 去除行首尾的空白字符
            line.erase(0, line.find_first_not_of(" \t\n\r"));
            line.erase(line.find_last_not_of(" \t\n\r") + 1);

            // 检查文件内容是否包含 PEM 开始和结束标记
            if (line.find("-----BEGIN") != std::string::npos) {
                hasBegin = true;
            }
            if (line.find("-----END") != std::string::npos) {
                hasEnd = true;
            }

            // 如果两者都存在,且不是同一行,就可以认为是 PEM 格式
            if (hasBegin && hasEnd) {
                break;
            }
        }

        file.close();

        // 如果文件包含 BEGIN 和 END 标识符,且位置合理,认为它是 PEM 文件
        return hasBegin && hasEnd;
    }


    bool getNameFromFile(const std::string& filePath, std::string& outName) {
        std::ifstream file(filePath);
        if (!file.is_open()) {
            // 使用 MessageBox 显示错误信息
            std::wstring wFilePath(filePath.begin(), filePath.end());
            std::wstring errorMessage = L"Error opening file: " + wFilePath;
            MessageBoxW(NULL, errorMessage.c_str(), L"File Error", MB_OK | MB_ICONERROR);
            return false;
        }

        std::string firstLine;
        std::getline(file, firstLine);  // 读取第一行

        // 使用正则表达式提取 name: 后面的内容
        std::regex nameRegex("^name:\\s*(.*)$", std::regex_constants::icase);
        std::smatch match;

        if (std::regex_match(firstLine, match, nameRegex) && match.size() > 1) {
            outName = match.str(1);  // 提取 name 后的部分
            return true;
        }

        // 如果没有找到有效的 name, 使用 MessageBox 显示错误
        MessageBoxW(NULL, L"No valid name found in the first line.", L"File Error", MB_OK | MB_ICONERROR);
        return false;
    }

    // 封装读取、合并和写入文件的函数
    bool combineFilesToNewFile(const std::string& txtFilePath, const std::string& pemFilePath) {
        // 读取 txt 文件内容
        std::ifstream txtFile(txtFilePath, std::ios::binary);
        if (!txtFile.is_open()) {
            // 使用 MessageBox 显示错误信息
            std::wstring wTxtFilePath(txtFilePath.begin(), txtFilePath.end());
            std::wstring errorMessage = L"Error opening txt file: " + wTxtFilePath;
            MessageBoxW(NULL, errorMessage.c_str(), L"File Error", MB_OK | MB_ICONERROR);
            return false;
        }

        std::ostringstream txtContentStream;
        txtContentStream << txtFile.rdbuf();
        std::string txtContent = txtContentStream.str();
        txtFile.close();

        // 读取 pem 文件内容
        std::ifstream pemFile(pemFilePath, std::ios::binary);
        if (!pemFile.is_open()) {
            // 使用 MessageBox 显示错误信息
            std::wstring wPemFilePath(pemFilePath.begin(), pemFilePath.end());
            std::wstring errorMessage = L"Error opening pem file: " + wPemFilePath;
            MessageBoxW(NULL, errorMessage.c_str(), L"File Error", MB_OK | MB_ICONERROR);
            return false;
        }

        std::ostringstream pemContentStream;
        pemContentStream << pemFile.rdbuf();
        std::string pemContent = pemContentStream.str();
        pemFile.close();

        // 合并两个文件的内容
        std::string combinedContent = txtContent + "\n" + pemContent;

        // 从 txt 文件获取 name 并创建输出文件名
        std::string outputFileName;
        if (!getNameFromFile(txtFilePath, outputFileName)) {
            // 如果从文件中未提取到名字,显示错误
            MessageBoxW(NULL, L"Failed to extract name from txt file.", L"File Error", MB_OK | MB_ICONERROR);
            return false;
        }

        // 为输出文件创建完整路径(假设输出文件为 .txt)
        std::string outputFilePath = outputFileName + ".txt";

        // 将合并后的内容写入到输出文件
        std::ofstream outputFile(outputFilePath, std::ios::binary);
        if (!outputFile.is_open()) {
            // 使用 MessageBox 显示错误信息
            std::wstring wOutputFilePath(outputFilePath.begin(), outputFilePath.end());
            std::wstring errorMessage = L"Error opening output file: " + wOutputFilePath;
            MessageBoxW(NULL, errorMessage.c_str(), L"File Error", MB_OK | MB_ICONERROR);
            return false;
        }

        outputFile.write(combinedContent.c_str(), combinedContent.size());
        outputFile.close();

        // 使用 MessageBox 显示成功信息
        std::wstring successMessage = L"Files successfully combined and written to: " + std::wstring(outputFilePath.begin(), outputFilePath.end());
        MessageBoxW(NULL, successMessage.c_str(), L"Success", MB_OK | MB_ICONINFORMATION);
        SHA256 sha256;
        // 计算文件的哈希值(使用 SHA-256)
        std::string hashValue;
        if (sha256.computeFileHash(outputFilePath, hashValue)) {
            // 显示哈希值
            std::wstring hashMessage = L"SHA-256 Hash: " + std::wstring(hashValue.begin(), hashValue.end());
            MessageBoxW(NULL, hashMessage.c_str(), L"Hash Result", MB_OK | MB_ICONINFORMATION);

            // 将哈希值保存在另一个文件中
            std::string hashFileName = outputFileName + "_hash.txt";
            std::ofstream hashFile(hashFileName);
            if (hashFile.is_open()) {
                hashFile << hashValue;
                hashFile.close();

                // 提示保存哈希文件
                std::wstring hashFileMessage = L"Hash saved to: " + std::wstring(hashFileName.begin(), hashFileName.end());
                MessageBoxW(NULL, hashFileMessage.c_str(), L"Success", MB_OK | MB_ICONINFORMATION);
            }
            else {
                MessageBoxW(NULL, L"Error saving hash to file.", L"File Error", MB_OK | MB_ICONERROR);
            }
        }
        else {
            MessageBoxW(NULL, L"Failed to compute hash for the output file.", L"Error", MB_OK | MB_ICONERROR);
            return false;
        }

        return true;
    }


    // 保存文本到文件
    void saveFile(const std::string& filePath, const std::string& text) {
        std::ofstream file(filePath, std::ios::binary);  // 以二进制模式打开文件
        if (!file.is_open()) {
            throw std::ios_base::failure("Error opening file: " + filePath);  // 抛出异常
        }

        file.write(text.c_str(), text.size());
        if (!file) {  // 检查写入是否成功
            throw std::ios_base::failure("Error writing to file: " + filePath);
        }
    }

    // 删除文件
    void deleteFile(const std::string& filePath) {
        if (std::remove(filePath.c_str()) != 0) {
            throw std::ios_base::failure("Error deleting file: " + filePath);  // 抛出异常
        }
    }

}

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

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

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

相关文章

【Git】Git 命令参考手册

目录 Git 命令参考手册1. 创建仓库1.1 创建一个新的本地仓库1.2 克隆一个仓库1.3 克隆仓库到指定目录 2. 提交更改2.1 显示工作目录中已修改的文件&#xff0c;准备提交2.2 将文件添加到暂存区&#xff0c;准备提交2.3 将所有已修改的文件添加到暂存区&#xff0c;准备提交2.4 …

【Linux系列】Chrony时间同步服务器搭建完整指南

1. 简介 Chrony是一个用于Linux系统的高效、精准的时间同步工具&#xff0c;通常用于替代传统的NTP&#xff08;Network Time Protocol&#xff09;服务。Chrony不仅在系统启动时提供快速的时间同步&#xff0c;还能在时钟漂移较大的情况下进行及时调整&#xff0c;因此广泛应…

数据库日志

MySQL中有哪些日志 1&#xff0c;redo log重做日志 redo log是物理机日志&#xff0c;因为它记录的是对数据页的物理修改&#xff0c;而不是SQL语句。 作用是确保事务的持久性&#xff0c;redo log日志记录事务执行后的状态&#xff0c;用来恢复未写入 data file的已提交事务…

【vue for beginner】Vue该怎么学?

&#x1f308;Don’t worry , just coding! 内耗与overthinking只会削弱你的精力&#xff0c;虚度你的光阴&#xff0c;每天迈出一小步&#xff0c;回头时发现已经走了很远。 vue2 和 vue3 Vue2现在正向vue3逐渐更新中&#xff0c;官方vue2已经不再更新。 这个历程和当时的pyt…

【Ubuntu 24.04】How to Install and Use NVM

参考 下载 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash激活 Activate NVM: Once the installation script completes, you need to either close and reopen the terminal or run the following command to use nvm immediately. exp…

SeggisV1.0 遥感影像分割软件【源代码】讲解

在此基础上进行二次开发&#xff0c;开发自己的软件&#xff0c;例如&#xff1a;【1】无人机及个人私有影像识别【2】离线使用【3】变化监测模型集成【4】个人私有分割模型集成等等&#xff0c;不管是您用来个人学习 还是公司研发需求&#xff0c;都相当合适&#xff0c;包您满…

Python轴承故障诊断 (21)基于VMD-CNN-BiTCN的创新诊断模型

往期精彩内容&#xff1a; Python-凯斯西储大学&#xff08;CWRU&#xff09;轴承数据解读与分类处理 Pytorch-LSTM轴承故障一维信号分类(一)-CSDN博客 Pytorch-CNN轴承故障一维信号分类(二)-CSDN博客 Pytorch-Transformer轴承故障一维信号分类(三)-CSDN博客 三十多个开源…

使用docker搭建hysteria2服务端

源链接&#xff1a;https://github.com/apernet/hysteria/discussions/1248 官网地址&#xff1a;https://v2.hysteria.network/zh/docs/getting-started/Installation/ 首选需要安装docker和docker compose 切换到合适的目录 cd /home创建文件夹 mkdir hysteria创建docke…

基于Java实现的潜艇大战游戏

基于Java实现的潜艇大战游戏 一.需求分析 1.1 设计任务 本次游戏课程设计小组成员团队合作的方式&#xff0c;通过游戏总体分析设计&#xff0c;场景画面的绘制&#xff0c;游戏事件的处理&#xff0c;游戏核心算法的分析实现&#xff0c;游戏的碰撞检测&#xff0c;游戏的反…

课题组自主发展了哪些CMAQ模式预报相关的改进技术?

空气污染问题日益受到各级政府以及社会公众的高度重视&#xff0c;从实时的数据监测公布到空气质量数值预报及预报产品的发布&#xff0c;我国在空气质量监测和预报方面取得了一定进展。随着计算机技术的高速发展、空气污染监测手段的提高和人们对大气物理化学过程认识的深入&a…

深入解析下oracle date底层存储方式

之前我们介绍了varchar2和char的数据库底层存储格式&#xff0c;今天我们介绍下date类型的数据存储格式&#xff0c;并通过测试程序快速获取一个日期。 一、环境搭建 1.1&#xff0c;创建表 我们还是创建一个测试表t_code&#xff0c;并插入数据&#xff1a; 1.2&#xff0c;…

【论文复现】SRGAN

1. 项目结构 如何生成文件夹的文件目录呢? 按住shift键,右击你要生成目录的文件夹,选择“在此处打开Powershell窗口” 在命令窗口里输入命令“tree”,按回车。就会显示出目录结构。 ├─.idea │ └─inspectionProfiles ├─benchmark_results ├─data │ ├─test …

Kubernetes 之 Ingress 和 Service 的异同点

1. 概念与作用 1.1 Ingress Ingress 是什么&#xff1f; Ingress主要负责七层负载&#xff0c;将外部 HTTP/HTTPS 请求路由到集群内部的服务。它可以基于域名和路径定义规则&#xff0c;从而将外部请求分配到不同的服务。 ingress作用 提供 基于 HTTP/HTTPS 的路由。 支持 …

结构体详解+代码展示

系列文章目录 &#x1f388; &#x1f388; 我的CSDN主页:OTWOL的主页&#xff0c;欢迎&#xff01;&#xff01;&#xff01;&#x1f44b;&#x1f3fc;&#x1f44b;&#x1f3fc; &#x1f389;&#x1f389;我的C语言初阶合集&#xff1a;C语言初阶合集&#xff0c;希望能…

Springboot项目搭建(7)

1.概要 2.Layout主页布局 文件地址&#xff1a;src\views\Layout.vue 2.1 script行为模块 从elementUI中选取图标图案。 <script setup> import {Management,Promotion,UserFilled,User,Crop,EditPen,SwitchButton,CaretBottom } from "element-plus/icons-vue…

cocos creator 3.8 俄罗斯方块Demo 10

这里的表格是横行数列&#xff0c;也就是x是行&#xff0c;y是列&#xff0c;不要当x/y轴看。 1-1012-1012-1-1[-1,0]0[0,-1][0,0][0,1][0,2]0[0,0]11[1,0]22[2,0] -1012-1012-1-1[-1,0]0[0,-1][0,0][0,1][0,2]0[0,0]11[1,0]22[2,0] 2-1012-1012-1[-1,-1][-1,0]-1[-1,-1][-1…

Java安全—原生反序列化重写方法链条分析触发类

前言 在Java安全中反序列化是一个非常重要点&#xff0c;有原生态的反序列化&#xff0c;还有一些特定漏洞情况下的。今天主要讲一下原生态的反序列化&#xff0c;这部分内容对于没Java基础的来说可能有点难&#xff0c;包括我。 序列化与反序列化 序列化&#xff1a;将内存…

【Java 学习】面向程序的三大特性:封装、继承、多态

引言 1. 封装1.1 什么是封装呢&#xff1f;1.2 访问限定符1.3 使用封装 2. 继承2.1 为什么要有继承&#xff1f;2.2 继承的概念2.3 继承的语法2.4 访问父类成员2.4.1 子类中访问父类成员的变量2.4.2 访问父类的成员方法 2.5 super关键字2.6 子类的构造方法 3. 多态3.1 多态的概…

LeetCode—74. 搜索二维矩阵(中等)

仅供个人学习使用 题目描述&#xff1a; 给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。 每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回 true…

uniapp关闭sourceMap的生成,提高编译、生产打包速度

警告信息&#xff1a;[警告⚠] packageF\components\mpvue-echarts\echarts.min.js 文件体积超过 500KB&#xff0c;已跳过压缩以及 ES6 转 ES5 的处理&#xff0c;手机端使用过大的js库影响性能。 遇到问题&#xff1a;由于微信小程序引入了mpvue-echarts\echarts.min.js&…