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

#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.mzph.cn/news/887645.shtml

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

相关文章

前端-Git

一.基本概念 Git版本控制系统时一个分布式系统&#xff0c;是用来保存工程源代码历史状态的命令行工具 简单来说Git的作用就是版本管理工具。 Git的应用场景&#xff1a;多人开发管理代码&#xff1b;异地开发&#xff0c;版本管理&#xff0c;版本回滚。 Git 的三个区域&a…

深入浅出摸透AIGC文生图产品SD(Stable Diffusion)

hihi,朋友们,时隔半年(24年11月),终于能腾出时间唠一唠SD了🤣,真怕再不唠一唠,就轮不到SD了,技术更新换代是在是太快! 朋友们,最近(24年2月)是真的没时间整理笔记,每天都在疯狂的学习Stable Diffusion和WebUI & ComfyUI,工作实在有点忙,实践期间在飞书上…

HCIP——堆叠技术实验配置

目录 一、堆叠的理论知识 二、堆叠技术实验配置 三、总结 一、堆叠的理论知识 1.1堆叠概述&#xff1a; 是指将两台交换机通过堆叠线缆连接在一起&#xff0c;从逻辑上变成一台交换设备&#xff0c;作为一个整体参与数据的转发。 1.2堆叠的基本概念 堆叠系统中所有的单台…

快速上手:如何开发一个实用的 Edge 插件

在日常浏览网页时&#xff0c;背景图片能够显著提升网页的视觉体验。如果你也想为自己的浏览器页面添加个性化背景图片&#xff0c;并希望背景图片设置能够持久保存&#xff0c;本文将介绍如何通过开发一个自定义Edge插件来实现这一功能。我们将涵盖保存背景设置到插件选项页&a…

介绍一下atol(arr);(c基础)

hi , I am 36 适合对象c语言初学者 atol(arr)&#xff1b;是返回整数(long型)&#xff0c;整数是arr数组中字符中数字 格式 #include<stdio.h> atol(arr); 返回值arr数组中的数字 未改变arr数组 #include<stdio.h> //atol(arr); 返 <stdlib> int main…

Python的排序算法

一、算法 1.1 算法概念 算法就是计算机解决问题的方法或者步骤 程序 数据结构 算法 1.2 算法的特性 1】确定性&#xff1a; 算法的每条语句具有明确的意思&#xff0c;不能模棱两可 2】有穷性&#xff1a;在执行一定的时间后&#xff0c;能自动结束算法 3】输入&#…

npm install -g@vue/cli报错解决:npm error code ENOENT npm error syscall open

这里写目录标题 报错信息1解决方案 报错信息2解决方案 报错信息1 使用npm install -gvue/cli时&#xff0c;发生报错&#xff0c;报错图片如下&#xff1a; 根据报错信息可以知道&#xff0c;缺少package.json文件。 解决方案 缺什么补什么&#xff0c;这里我们使用命令npm…

在windows操作系统上,用git与github账户连接

一、环境准备 1.1 git软件 1.2 github账号 1.3 创建一个项目目录&#xff0c;比如 D:\project\gitproject 二、开始操作 1. 进入项目目录下&#xff0c;右键&#xff0c;如图&#xff0c;打开git bash命令行 2. 在命令行输入以下三个命令 $ git config --global user.name &quo…

视频监控实现画面缩放功能

文章目录 概要一、功能说明二、核心实现代码三、技术细节 概要 在视频监控系统中&#xff0c;经常需要查看视频画面中的细节。通过实现区域放大、滚轮缩放和拖拽平移等功能&#xff0c;可以让用户更方便地观察视频细节。本文介绍如何在 Windows 系统下实现这些交互功能。 一、…

鸿蒙本地模拟器 模拟TCP服务端的过程

鸿蒙模拟器模拟TCP服务端的过程涉及几个关键步骤&#xff0c;主要包括创建TCPSocketServer实例、绑定IP地址和端口、监听连接请求、接收和发送数据以及处理连接事件。以下是详细的模拟过程&#xff1a; **1.创建TCPSocketServer实例&#xff1a;**首先&#xff0c;需要导入鸿蒙…

Three.js 和其他 WebGL 库 对比

在WebGL开发中&#xff0c;Three.js是一个非常流行的库&#xff0c;它简化了3D图形的创建和渲染过程。然而&#xff0c;市场上还有许多其他的WebGL库&#xff0c;如 Babylon.js、PlayCanvas、PIXI.js 和 Cesium&#xff0c;它们也有各自的特点和优势。本文将对Three.js 与这些常…

【04】MySQL数据库和数据表的基本操作详解与实例

文章目录 一、连接MySQL服务器二、数据库的基本操作2.1数据库的基本操作1. 创建数据库2. 选择数据库3. 删除数据库4.查询所有数据库5.修改数据库的字符集 2.2 数据表的基本操作1. 创建数据表2. 查看数据表结构3. 删除数据表4. 修改数据表5. 插入数据6. 查询数据7. 更新数据8. 删…

CTF-Hub SQL 报错注入(纯手动注入)

​ 当输入1时&#xff0c;发现只有查询正确&#xff0c;基本上可以判断出没有回显 开始注入(工具hackerBar) 题目是报错注入&#xff0c;方向就比较明显&#xff0c;大致说一下用到的函数和原理。 常见报错注入函数&#xff1a; 通过 floor() 报错注入通过 extractValue() …

2024 阿里云的Debian12.8,安装mariadb【图文讲解】

目录 一、安装 MariaDB Server 二、登录到MariaDB&#xff0c;记得输入密码&#xff08;注意&#xff1a;密码非明文&#xff0c;只管输入&#xff0c;完成以后回车&#xff09; 三、创建用户 root&#xff0c;并允许从任何主机连接 四、授予用户访问权限 五、刷新权限 六、…

新用户引导库-driverjs

一个比好用的新用户引导的库 driverjs 在做这个功能时&#xff0c;首先要确定目标是什么样子的&#xff0c; 如果只是随意点击下一步下一步&#xff0c;那我感觉可能用图片轮播图的方式会快一点&#xff0c;更容易解决且方便&#xff0c;想要什么步骤 只需要更改图片就好&…

鸿蒙保存读取沙盒文件

鸿蒙保存读取沙盒文件 参考文件 有些时候需要保存并读取沙盒环境的文件。这样做保存一些临时文件&#xff0c;确保发送网络之前数据不会丢失&#xff0c;或者存储一些只需要在本地使用的数据等等。本文介绍一下相关的操作方式。 获取文件路径 想要保存或者读取文件&#xf…

八、利用CSS制作导航栏菜单的习题

题目一&#xff1a; 利用CSS技术&#xff0c;结合链接和样表&#xff0c;设计并实现“ 山水之间 ”页面。 运行效果&#xff1a; 代码 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>山水之间</title>&l…

ML 系列:第 31 节— 机器学习中的协方差和相关性

文章目录 一、说明二、协方差和相关性2.1 协方差的概念2.1 相关 三、有关关联的高级主题 &#xff08;有关详细信息&#xff09;3.1 相关性和独立性3.2 零相关性和依赖性示例 四、相关性和因果关系五、结论 一、说明 协方差量化了两个随机变量协同变化的程度。当一个变量的较高…

谈谈微服务的常用组件

由于微服务给系统开发带来了一些问题和挑战&#xff0c;如服务调用的复杂性、分布式事务的处理、服务的动态管理等&#xff0c;为了更好地解决这些问题和挑战&#xff0c;各种微服务治理的组件应运而生&#xff0c;充当微服务架构的基石和支撑&#xff0c;常用组件如下表&#…

2024算法基础公选课练习七(BFS1)

一、前言 还是偏基础的bfs&#xff0c;但是有几个题不是很好写 二、题目总览 三、具体题目 3.1 问题 A: 数据结构-队列-奇怪的电梯 我的代码 可以看成求一维平面的bfs最短路 #include <bits/stdc.h> using i64 long long; using pii std::pair<int,int>; co…