MFC文件和注册表的操作

news/2025/2/27 2:11:27

MFC文件和注册表的操作

日志、操作配置文件、ini、注册表、音视频的文件存储

Linux下一切皆文件

C/C++操作文件

const char* 与 char* const

const char* 常量指针,表示指向的内容为常量。指针可以指向其他变量,但是内容不能再变了


char szName[6]="Bingo";
const char* pName = szName;
*pName = 'b';错误
//pName常量指针,表示指向的内容为常量。指针可以指向其他变量,但是内容不能再变了
-----------------------------------------------------
char szName[6]="Bingo";
char * const pName=szName;
char *p;错误
*pNmae = 'b';正确
//表示pName是指针常量;表示地址是常量。不能再变了。但是内容可以改变

C语言操作文件

_Check_return_wat_
_Success_(return == 0)
_ACRTIMP errno_t __cdecl fopen_s(
	_Outptr_result_nullonfailure_ FILE** _Stream,
	_In_z_                   char const* _FileName,
	_In_z_                   char const* _Mode //文件打开方式
);
  • 文件打开的模式
    • 'r’模式:这是“只读”模式。如果文件不存在,尝试打开将失败。文件指针位于文件开头,不会清空文件原有内容。
    • 'w’模式:这是“只写”模式。如果文件存在,它将被清空并从头开始写入;如果文件不存在,将创建一个新文件。文件指针位于文件开头。
    • 'a’模式:**这是“追加”模式。如果文件存在,写入的数据将添加到文件末尾,不会清空原有内容;**如果文件不存在,将创建一个新文件。文件指针位于文件结尾。
    • 'r+'模式:这是“读写”模式。文件必须存在,文件指针位于文件开头。可以在文件任意位置读取或写入内容,写入操作会覆盖原有位置的内容。
    • 'w+'模式:这也是“读写”模式。它类似于’w’模式,但是它允许读取操作。打开文件后,会清空文件内原有的内容。
    • 'a+'模式:这同样是“读写”模式。它类似于’a’模式,但是它允许读取操作。写入内容时,只会追加在文件尾部。
_Check_return_opt_
    _ACRTIMP size_t __cdecl fwrite(
    _In_reads_bytes_(_ElementSize * _ElementCount)       void     const*        _Buffer,
    _In_     size_t        _ElementSize,//一个元素的字节数
    _In_     size_t        _ElementCount,//元素个数
    _Inout_  FILE*         _Stream
);

对于宽字节而言 wchar a[20] = “bingo”;

ANSI char a[20]=“bingo”;

fseek(//文件指针的定位
    _Inout_ FILE* _Stream, //指向FILE结构体指针
    _In_    long  _Offset, //偏移量
    _In_    int   _Origin  //指定文件指针的起始位置
    //SEEK_CUR 当前位置,
    //SEEK_END 文件结尾位置 
    //SEEK_SET文件开始位置
);
Ftell 返回文件指针的当前位置
  • 文件操作

    void CMyMFCFileView::OnFileWrite()
    {
    	FILE* pFile = NULL;
     	//打开文件
     	errno_t err = _wfopen_s(&pFile, _T("1.txt"),_T("w"));
     	if (err == 0)
     	{
     		MessageBox(_T("Open Success!!"));
     	}
     	else
     	{
     		TRACE("Open Failed ErrorCode = %d", GetLastError());
     		return;
     	}
    
    	//fwrite()
    	//WCHAR a[20] = L"bingo";//宽字节而言 一个元素的字节数是2
     //   char a1[20] = "bingo";//ANSI        一个元素的字节数是1
    	//TRACE("*************a = %d, a1 = %d", sizeof(a), sizeof(a1)); //40,20
    
    	//fwrite("Bingo", 1, strlen("bingo"), pFile);
    	fwrite(L"Bingo", 2, wcslen(_T("bingo")) + 1, pFile);//宽字节
    	fclose(pFile);
    
    }
    
    void CMyMFCFileView::OnFileRead()
    {
    	FILE* pFile = NULL;
    	//打开文件
    	errno_t err = _wfopen_s(&pFile, _T("1.txt"), _T("r"));
    	if (err != 0)
    	{
    		TRACE("Open Failed ErrorCode = %d", GetLastError());
    		return;
    	}
    #if 0
    	WCHAR pBuf[100] = { 0 };//长度是未知的!!!
    	fread(pBuf,2,100,pFile);
    	MessageBox(pBuf);
    #endif
    	fseek(pFile,0,SEEK_END);//偏移到结尾位置
    	int len = ftell(pFile); //文件指针的当前位置(文件长度)
    	WCHAR* pBuf = new WCHAR[len + 1];
    	fseek(pFile, 0, SEEK_SET);//偏移到起始位置
    	//rewind(pFile);//将文件指针重新放到文件开始处
    	pBuf[len] = 0;//确保数组最后一个元素为'\0'
    	fread(pBuf, 2, len, pFile);//从指针位置开始读
    	MessageBox(pBuf);
    
    	fclose(pFile);
    
    }
    

C++操作文件

ofstream

explicit basic_ofstream(const char* _Filename, ios_base::openmode _Mode = ios_base::out,
  int _Prot = ios_base::_Default_open_prot)
#include <io.h>
#include <fstream>
using namespace std;

void CMyMFCFileView::OnFileWrite()
{
	ofstream ofs("2.txt"); //第一个参数表示文件名,2打开方式
	ofs.write("BingoC++", strlen("BingoC++"));
	ofs.close();
}

void CMyMFCFileView::OnFileRead()
{
	ifstream ifs("2.txt");
	char pBuf[100] = { 0 };
	ifs.read(pBuf, 100);
	USES_CONVERSION;
	CString str = A2W(pBuf);
	MessageBox(str); 
	ifs.close();
}

Win32 API/MFC操作文件

CreateFile

文件、管道、邮槽 通信资源、磁盘设备、控制台、目录

CreateFileW(
    LPCWSTR lpFileName,   //创建或打开的对象的名称
    DWORD dwDesiredAccess,	//访问方式 读、读写、写、查询 0 GENERIC_READ,GENERIC_WRITE
    DWORD dwShareMode,		//共享方式 0 
    LPSECURITY_ATTRIBUTES lpSecurityAttributes, //NULL,安全权限,不能被子进程继承
    DWORD dwCreationDisposition,	//如何创建文件 CREATE_NEW CREATE_ALWAYS
    DWORD dwFlagsAndAttributes,	//设置文件的属性和标志
    HANDLE hTemplateFile		//NULL
 	);

WriteFile(
    HANDLE hFile,
    LPCVOID lpBuffer,
    DWORD nNumberOfBytesToWrite,		//要写入的字节数
    LPDWORD lpNumberOfBytesWritten,	//用来接收实际写入到文件的字节数
    LPOVERLAPPED lpOverlapped
);
ReadFile(
    HANDLE hFile,
    LPVOID lpBuffer,
    DWORD nNumberOfBytesToRead, 
    LPDWORD lpNumberOfBytesRead,
    LPOVERLAPPED lpOverlapped
);

Win32 API 操作文件

void CMyMFCFileView::OnFileWrite()
{
	HANDLE hFile;

	hFile = CreateFile(_T("3.txt"), GENERIC_WRITE, 0, NULL, 
		CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
	if (hFile == INVALID_HANDLE_VALUE)
	{
		TRACE("INVALID_HANDLE_VALUE, ERRORCODE = %d", GetLastError());
		return;
	}

	DWORD dwWrites;
	WriteFile(hFile, "BingoWin32API", strlen("BingoWin32API"), &dwWrites, NULL);
	TRACE("###dwWrite = %d", dwWrites);
	CloseHandle(hFile);

}

void CMyMFCFileView::OnFileRead()
{
	HANDLE hFile;

	hFile = CreateFile(_T("3.txt"), GENERIC_READ, 0, NULL,
		OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);//读数据、已存在的

	char pBuf[100] = { 0 };
	DWORD dwReads;
	ReadFile(hFile, pBuf, 100, &dwReads, NULL);
	TRACE("###dwReads = %d", dwReads);
	CloseHandle(hFile);
}

MFC操作文件

void CMyMFCFileView::OnFileWrite()
{
	//CFile(LPCTSTR lpszFileName, UINT nOpenFlags);  文件名、
	CFile file(L"4.txt", CFile::modeCreate | CFile::modeWrite);
	file.Write("BingoMFC", strlen("BingoMFC"));
	file.Close();

}

void CMyMFCFileView::OnFileRead()
{
	CFile file(L"4.txt", CFile::modeRead);
	char* pBuf;
	DWORD dwFileLen = file.GetLength();
	pBuf = new char[dwFileLen + 1];
	pBuf[dwFileLen] = 0;
	file.Read(pBuf, dwFileLen);
	file.Close();
	USES_CONVERSION;
	CString str = A2W(pBuf);
	MessageBox(str);
}
基于文件对话框的读写

派生关系:CFileDialog -> CCommonDialog -> CDialog -> CWnd -> CCmdTarget -> CObject

CFileDialog(BOOL bOpenFileDialog, // TRUE for FileOpen, FALSE for FileSaveAs
            LPCTSTR lpszDefExt = NULL,
            LPCTSTR lpszFileName = NULL,
            DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
            LPCTSTR lpszFilter = NULL,
            CWnd* pParentWnd = NULL,
            DWORD dwSize = 0,
            BOOL bVistaStyle = TRUE
           ); 
void CMyMFCFileView::OnFileWrite()
{
	// 	CFileDialog(BOOL bOpenFileDialog,	// TRUE for 构建一个打开的对话框, FALSE for 构建一个保存对话框
// 		LPCTSTR lpszDefExt = NULL,		// 指定默认的文件扩展名 NULL
// 		LPCTSTR lpszFileName = NULL,	// 初始文件名 NULL 默认没有初始文件名
// 		DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
// 		LPCTSTR lpszFilter = NULL,		//用来指定一个或一组文件的过滤器
// 		CWnd * pParentWnd = NULL,		//用来指定文件对话框的父窗口或者拥有窗口
// 		DWORD dwSize = 0,				//大小
// 		BOOL bVistaStyle = TRUE);		//可见或者不可见
	CFileDialog fileDlg(FALSE);
	fileDlg.m_ofn.lpstrTitle = L"Bingo"; //该窗口标题
	fileDlg.m_ofn.lpstrFilter = _T("Text Files (*.txt)");
	fileDlg.m_ofn.lpstrDefExt = L"txt";//默认保存类型
	//fileDlg.DoModal();
	if (IDOK == fileDlg.DoModal())
	{
		CFile file(fileDlg.GetFileName(), CFile::modeCreate | CFile::modeWrite);
		USES_CONVERSION;
		char* szBuf = T2A(fileDlg.GetFileName());
		TRACE("####fileDlg.GetFileName() = %s", szBuf);
		file.Write("BingoMFC111", strlen("BingoMFC111"));
		file.Close();
	}
}

void CMyMFCFileView::OnFileRead()
{
// 	CFileDialog(BOOL bOpenFileDialog,	// TRUE for 构建一个打开的对话框, FALSE for 构建一个保存对话框
// 		LPCTSTR lpszDefExt = NULL,		// 指定默认的文件扩展名 NULL
// 		LPCTSTR lpszFileName = NULL,	// 初始文件名 NULL 默认没有初始文件名
// 		DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
// 		LPCTSTR lpszFilter = NULL,		//用来指定一个或一组文件的过滤器
// 		CWnd * pParentWnd = NULL,		//用来指定文件对话框的父窗口或者拥有窗口
// 		DWORD dwSize = 0,				//大小
// 		BOOL bVistaStyle = TRUE);		//可见或者不可见
	CFileDialog fileDlg(TRUE);
	fileDlg.m_ofn.lpstrTitle = L"Bingo"; //该窗口标题
	fileDlg.m_ofn.lpstrFilter = _T("Chart Files (*.xlc)|*.xlc|")
		_T("Worksheet Files (*.xls)|*.xls|Data Files (*.xlc;*.xls)|")
		_T("*.xlc; *.xls|All Files (*.*)|*.*||"); //该窗口标题
	//fileDlg.DoModal();
	if (IDOK == fileDlg.DoModal())
	{
		CFile file(fileDlg.GetFileName(), CFile::modeRead);
		char* pBuf;
		DWORD dwFileLen = file.GetLength();
		pBuf = new char[dwFileLen + 1];
		pBuf[dwFileLen] = 0;
		file.Read(pBuf, dwFileLen);
		file.Close();

		USES_CONVERSION;
		CString	 szBuf = A2W(pBuf);
		MessageBox(szBuf);
	}
	
}

配置文件的访问与读写

[metadata]
title=搜狗双拼
[声母]
ch=I
sh=U
void CMyMFCFileView::OnWriteConfig()
{
	// TODO: 在此添加命令处理程序代码
	//获得当前路径
	WCHAR strPath[MAX_PATH] = { 0 };
	GetCurrentDirectoryW(MAX_PATH, strPath);
	TRACE("333strPath = %s", strPath);
	// 当前路径: E:\奇牛培训\学习笔记\mfc\MyMFCFile\ + Test.ini
	CString strFilePath;
	strFilePath.Format(L"%ls//Test.ini", strPath);
	WritePrivateProfileStringW(L"metadata", L"title", L"搜狗双拼", strFilePath);

	WritePrivateProfileStringW(L"声母", L"ch", L"I", strFilePath);

	WritePrivateProfileStringW(L"声母", L"sh", L"U", strFilePath);
}

void CMyMFCFileView::OnReadConfig()
{	
	//获得当前路径
	WCHAR strPath[MAX_PATH] = { 0 };
	WCHAR strTitle[MAX_PATH] = { 0 }; 
	WCHAR strCh[MAX_PATH] = { 0 };
	WCHAR strSh[MAX_PATH] = { 0 };
	GetCurrentDirectoryW(MAX_PATH, strPath);
	TRACE("333strPath = %s", strPath);
	// 当前路径: E:\奇牛培训\学习笔记\mfc\MyMFCFile\ + Test.ini
	CString strFilePath;
	strFilePath.Format(L"%ls//Test.ini", strPath);

	DWORD dwNum1 = GetPrivateProfileStringW(L"metadata", L"title", NULL, strTitle, MAX_PATH, strFilePath);
	DWORD dwNum2 = GetPrivateProfileStringW(L"声母", L"ch", NULL, strCh, MAX_PATH, strFilePath);
	DWORD dwNum3 = GetPrivateProfileStringW(L"声母", L"sh", NULL, strSh, MAX_PATH, strFilePath);

	TRACE("dwNum1 = %d,dwNum2 = %d,dwNum3 = %d", dwNum1, dwNum2, dwNum3);
	USES_CONVERSION;
	char* szTitle = W2A(strTitle);
	char* szCh = W2A(strCh);
	char* szSh = W2A(strSh);
	TRACE("strTitle = %s,strCh = %s,strSh = %s", szTitle, szCh, szSh);
}

注册表编程

注册表API

注册表 存储在二进制文件里面,win32API提供了大量的函数操作注册表

注册表:Win+R组合键 regedit

注册表读写

write

	RegCreateKeyW(
		_In_ HKEY hKey,				//打开的当前项的句柄 实际上就是那几个分支
		_In_opt_ LPCWSTR lpSubKey,	//打开或者创建的表项的名称
		_Out_ PHKEY phkResult		//用来接收创建或者打开表项句柄 regclose
	);

	RegOpenKeyW(
			_In_ HKEY hKey,
			_In_opt_ LPCWSTR lpSubKey,
			_Out_ PHKEY phkResult
		);

	//写入注册表
	RegSetValueW(
		_In_ HKEY hKey,				//打开的当前项的句柄 实际上就是那几个分支
		_In_opt_ LPCWSTR lpSubKey,	//打开或者创建的表项的名称
		_In_ DWORD dwType,			//只是被存储信息的类型 REG_SZ类型
		_In_reads_bytes_opt_(cbData) LPCWSTR lpData,	//要存放到注册表里面的数据
		_In_ DWORD cbData			//要存放的字符串数据的大小、长度
	);

	RegSetValueExW(
		_In_ HKEY hKey,				//打开的当前项的句柄 实际上就是那几个分支
		_In_opt_ LPCWSTR lpValueName,//指向一个字符串的指针,包含了将要设置值的名称
		_Reserved_ DWORD Reserved,	//保留参数	0
		_In_ DWORD dwType,			//REG_BINARY
		_In_reads_bytes_opt_(cbData) CONST BYTE * lpData,
		_In_ DWORD cbData
	);

·read

	RegQueryValueW(
		_In_ HKEY hKey,					//打开的当前项的句柄 实际上就是那几个分支
		_In_opt_ LPCWSTR lpSubKey,
		_Out_writes_bytes_to_opt_(*lpcbData, *lpcbData) __out_data_source(REGISTRY) LPWSTR lpData,
		_Inout_opt_ PLONG lpcbData
	);
--------------管理员身份运行--------------------
----------------------------------------------
void CMyMFCFileView::OnWriteReg()
{

	HKEY hKey;
	DWORD dwAge = 39;
	//创建注册表项   管理员权限运行
	int ret = ::RegCreateKeyW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Rock\\admin", &hKey);
	//写注册表
	if(ret != ERROR_SUCCESS)
	{
		TRACE("RegCreateKeyW Failed, ErrorCode = %d", GetLastError());
		MessageBox(L"创建注册表失败");
		return;
	}
	//写注册表 
	::RegSetValueEx(hKey, L"age", 0, REG_DWORD, (CONST BYTE*) & dwAge, 4);
	::RegCloseKey(hKey);
}

void CMyMFCFileView::OnReadReg()
{
	HKEY hKey;
	DWORD dwAge;
	//创建注册表项   管理员权限运行
	int ret = ::RegOpenKeyW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Rock\\admin", &hKey);
	//写注册表
	if (ret != ERROR_SUCCESS)
	{
		TRACE("RegOpenKeyW Failed, ErrorCode = %d", GetLastError());
		MessageBox(L"打开注册表失败");
		return;
	}
	//写注册表 
	DWORD dwType;
	DWORD dwValue;
	::RegQueryValueEx(hKey, L"age", 0, &dwType, (LPBYTE) & dwAge,&dwValue);
	TRACE("####dwType = %d, dwValue = %d, dwAge = %d", dwType, dwValue, dwAge);
	::RegCloseKey(hKey);
}

文件操作的企业级应用

1、调试日志 debugview 文件日志:警告日志 错误日志

2、视频存储

3、文件传输 CFile 与 socket 结合使用

4、C语言和MFC的文件操作用途广泛;win32API少用 ifstream ofstream

5、配置文件 windows

6、注册表的操作 病毒 逆向 操作注册表


http://www.niftyadmin.cn/n/5869377.html

相关文章

SQL笔记#函数、谓词、CASE表达式

目录 一、各种各样的函数 1、函数的种类 2、算术函数 ABS——绝对值 MOD——取余 ROUND——四舍五入 3、字符串函数 ||——拼接 LENGTH——字符串长度 LOWER——小写转换 REPLACE——字符串的替换 SUBSTR——字符串的截取 UPPER——大写转换 4、日期函数 CURRENT_DATE——…

leetcode day22 59

59 螺旋矩阵 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;[[1,2,3],[8,9,4],[7,6,5]]示例 2&#xff1a; 输入&#xff1a;…

AutoMQ 可观测性实践:如何使用 OpenTelemetry 监控 Kafka 和底层流存储

前言 我们在之前的文章里介绍了 AutoMQ 如何与 Prometheus、观测云[1]、夜莺监控[2]等后端进行集成并实现对 AutoMQ 的监控&#xff0c;本文将进一步介绍 AutoMQ 的可观测性架构&#xff0c;以及 AutoMQ 如何实现多云可观测性。 可观测架构 Apache Kafka 的 Server 侧主要依…

基于Springboot的小说网站【附源码】

基于Springboot的小说网站 效果如下&#xff1a; 系统主页面 书库信息页面 书籍详情页面 推荐信息页面 小说推荐页面 书库信息页面 小说排行榜页面 系统管理页面 研究背景 随着互联网技术的快速发展&#xff0c;网络文学逐渐成为一种新兴的文学形式&#xff0c;吸引了大量读…

实体机器人在gazebo中的映射

这一部分目的是将真实的机器人映射到gazebo中&#xff0c;使得gazebo中的其他虚拟机器人能识别到真实世界的wheeltec机器人。 真实机器人的型号的wheeltec旗下的mini_mec。 一、在wheeltec官方百度云文档中找到URDF原始导出功能包.zip 找到对应的包 拷贝到工作空间下 在原有…

【C++】深入理解List:双向链表的应用

凭时间赢来的东西&#xff0c;时间肯定会为之作证。 前言 这是我自己学习C的第七篇博客总结。后期我会继续把C学习笔记开源至博客上。 上一期笔记是关于C的vector类知识&#xff0c;没看的同学可以过去看看&#xff1a;【C】探索Vector&#xff1a;灵活的数据存储解决方案-CS…

图扑农牧林数据分析可视化平台:智慧农业的“数字大脑”

在现代农业的发展中&#xff0c;数据的价值不言而喻。图扑推出的农牧林数据分析可视化平台&#xff0c;正是为农业数字化转型而生。 图扑平台基于自研的HT for Web GIS技术&#xff0c;结合遥感和卫星观测&#xff0c;构建了一个完整的农牧林数据可视化生态系统。平台不仅支持地…

elfk+zookeeper+kafka​数据流

申请7台部署elfkzookeeperkafka 数据流&#xff1a; filebeat(每台app) ------>【logstash(2) kafka(3)】 -------> logstash(1) -------> 【elasticsearch(3) kibana(1)】