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

ops/2024/11/29 18:25:14/
#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.ppmy.cn/ops/137711.html

相关文章

鸿蒙开发App 如何通过抓包查看 http 网络请求?

通过借助第三方工具 Charles https://www.charlesproxy.com/ https://www.zzzmode.com/mytools/charles/https://www.zzzmode.com/mytools/charles/ Charles 激活码计算器 相关博客日志&#xff1a;https://zhuanlan.zhihu.com/p/281126584 MAC上的使用方法&#xff1a; ch…

linux桌面qt应用程序UI自动化实现之dogtail

1. 前言 Dogtail适用于Linux 系统上进行 GUI 自动化测试,利用 Accessibility 技术与桌面程序通信;Dogtail 包含一个名为 sniff 的组件,这是一个嗅探器,用于 GUI 程序追踪; 源码下载:​​dogtail PyPI 可通过sudo python setup.py install安装或sudo pip install dogt…

【基础】jsonpath

https://jsonpath.com/ 背景&#xff1a; 处理多层嵌套&#xff0c;比较复杂&#xff0c;这时候某个json字段吸比较麻烦&#xff0c;此时&#xff0c;吸使用jsonpath来处理这类工作场景。 安装 pip install jsonpathimport jsonpathrelation [{id: 1, label: a1, children: …

C++中智能指针的使用及其原理 -- RAII,内存泄漏,shared_ptr,unique_ptr,weak_ptr

目录 1.智能指针的使用场景分析 2.RAII和智能指针的设计思路 3.C标准库智能指针的使用 4.智能指针的原理以及模拟实现 5.shared_ptr循环引用问题和weak_ptr 5.1shared_ptr循环引用问题 5.2weak_ptr的原理和部分接口 5.3weak_ptr的简单模拟实现 6. shared_ptr的线程安…

Tülu 3:重新定义开源大模型的后训练范式

一、引言 在大型语言模型&#xff08;LLM&#xff09;的发展历程中&#xff0c;预训练阶段往往受到最多关注&#xff0c;动辄需要数百万美元算力投入和数万亿token的训练数据。然而&#xff0c;一个鲜为人知但同样关键的事实是&#xff1a;预训练完成的模型实际上并不能直接投…

Modern Effective C++ item 15:尽可能的使用constexpr

constexpr表达式/对象/函数 constexpr表达式值不会改变并且在编译过程就能得到计算结果的表达式。声明为constexpr的变量一定是一个const变量&#xff0c;而且必须用常量表达式初始化: constexpr int mf 20; //20是常量表达式 constexpr int limit mf 1;// mf 1是常量表…

(超详细图文详情)Navicat 配置连接 Oracle

1、下载依赖文件 Oracle官网下载直链&#xff1a;https://www.oracle.com/database/technologies/instant-client/winx64-64-downloads.html 夸克网盘下载&#xff08;oracle19c版本&#xff09;&#xff1a;https://pan.quark.cn/s/5061e690debc 官网下载选择对应 Oracle 版…

Spring Boot教程之十二: Spring – RestTemplate

Spring – RestTemplate 由于流量大和快速访问服务&#xff0c;REST API越来越受欢迎。REST 不是一种协议或标准方式&#xff0c;而是一组架构约束。它也被称为 RESTful API 或 Web API。当发出客户端请求时&#xff0c;它只是通过 HTTP 将资源状态的表示传输给请求者或端点。传…