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、注册表的操作 病毒 逆向 操作注册表