MFC文件和注册表的操作
日志、操作配置文件、ini文件、注册表、音视频的文件存储。
Linux下一切皆文件。
C/C++文件操作
常量指针和指针常量
const char* p == char const *p 常量指针,表示指向的内容为常量,指针的指向可以修改,指针指向的内容不能修改。
char* const p 指针常量,表示地址是常量,指向不能改变,指向的内容可以改变。
C语言文件操作
文件打开的模式
![image-20220108164525100](https://gitee.com/Do2eM0N/blogimg/raw/master/202201091305850.png)
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| void CMFCFileView::OnFileWrite() { FILE* pFile = NULL; errno_t err = _wfopen_s(&pFile,_T("1.txt"),_T("w")); if (!err) { } else { TRACE("Open Fail ErrorCode = %d",GetLastError()); return; } fwrite(_T("ohguradianbyebye"), 2, wcslen(_T("ohguradianbyebye"))+1, pFile); fclose(pFile); }
void CMFCFileView::OnFileRead() { FILE* pFile = NULL; errno_t err = _wfopen_s(&pFile, _T("1.txt"), _T("r")); if (!err) { } else { TRACE("Open Fail ErrorCode = %d", GetLastError()); return; } fseek(pFile, 0, SEEK_END); int len = ftell(pFile); WCHAR *pBuf=new WCHAR[len+1]; fseek(pFile,0,SEEK_SET); fread(pBuf,2,len,pFile); pBuf[len] = 0; MessageBox(pBuf); fclose(pFile); }
|
C++文件操作
ofstream类
![image-20220108181527795](https://gitee.com/Do2eM0N/blogimg/raw/master/202201081815893.png)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| void CMFCFileView::OnFileWrite() { ofstream ofs("2.txt"); ofs.write("doraemon",strlen("droaemon")); ofs. close(); }
void CMFCFileView::OnFileRead() { ifstream ifs("2.txt"); char pBuf[100] = { 0 }; ifs.read(pBuf,100); USES_CONVERSION; CString strBuf = A2W(pBuf); MessageBox(strBuf); ifs.close(); }
|
Win32 API/MFC文件操作
Win32 API文件操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| HANDLE CreateFileA( [in] LPCSTR lpFileName, [in] DWORD dwDesiredAccess, [in] DWORD dwShareMode, [in, optional] LPSECURITY_ATTRIBUTES lpSecurityAttributes, [in] DWORD dwCreationDisposition, [in] DWORD dwFlagsAndAttributes, [in, optional] HANDLE hTemplateFile );
|
1 2 3 4 5 6 7 8 9
| WriteFile( _In_ HANDLE hFile, _In_reads_bytes_opt_(nNumberOfBytesToWrite) LPCVOID lpBuffer, _In_ DWORD nNumberOfBytesToWrite, _Out_opt_ LPDWORD lpNumberOfBytesWritten, _Inout_opt_ LPOVERLAPPED lpOverlapped );
|
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| void CMFCFileView::OnFileWrite() { HANDLE hFile; hFile = CreateFile(_T("3.txt"),GENERIC_WRITE,0,NULL,CREATE_NEW,FILE_ATTRIBUTE_NORMAL,NULL); if (hFile == INVALID_HANDLE_VALUE) { TRACE("%d", GetLastError()); return; } DWORD dwwrites; WriteFile(hFile,"Doraemon",strlen("Doraemon"),&dwwrites,NULL); CloseHandle(hFile); }
void CMFCFileView::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); USES_CONVERSION; CString strBuf = A2W(pBuf); MessageBox(strBuf); CloseHandle(hFile); }
|
MFC文件操作
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| void CMFCFileView::OnFileWrite() { CFile file(L"4.txt",CFile::modeCreate | CFile::modeWrite); file.Write("doraemon",strlen("doraemon")); file.Close(); }
void CMFCFileView::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); USES_CONVERSION; CString strBuf = A2W(pBuf); MessageBox(strBuf); file.Close(); }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| CFileDialog( BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter = NULL, CWnd* pParentWnd = NULL, DWORD dwSize = 0, BOOL bVistaStyle = TRUE);
|
例如:创建一个默认保存对话框
1 2
| CFileDialog fileDlg(FALSE); fileDlg.DoModal();
|
文件夹方式保存读取文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| void CMFCFileView::OnFileWrite() { CFileDialog fileDlg(FALSE); fileDlg.m_ofn.lpstrTitle = L"doraemon"; fileDlg.m_ofn.lpstrFilter = _T("Text Files(*.txt)\0*.txt\0All Files(*.*)\0*.*\0\0"); fileDlg.m_ofn.lpstrDefExt = L"txt"; if (fileDlg.DoModal() == IDOK) { CFile file(fileDlg.GetFileName(), CFile::modeCreate | CFile::modeWrite); USES_CONVERSION; char* szBuf = T2A(fileDlg.GetFileName()); TRACE("fileDlg.GetFileName()= %s", szBuf); file.Write("ZYXXX", strlen("ZYXXX")); file.Close(); }
}
void CMFCFileView::OnFileRead() { CFileDialog fileDlg(TRUE); fileDlg.m_ofn.lpstrTitle = L"doraemon"; fileDlg.m_ofn.lpstrFilter = _T("Text Files(*.txt)\0*.txt\0All Files(*.*)\0*.*\0\0"); if (fileDlg.DoModal() == IDOK) { 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 strBuf = A2W(pBuf ); MessageBox(strBuf); } }
|
![image-20220109101517226](https://gitee.com/Do2eM0N/blogimg/raw/master/202201091305759.png)
配置文件的访问与读写
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| void CMFCFileView::OnWirteConfig() { WCHAR strPath[MAX_PATH] = { 0 }; GetCurrentDirectoryW(MAX_PATH,strPath); 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 CMFCFileView::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); 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,strTitle,MAX_PATH,strFilePath); DWORD dwNum3 = GetPrivateProfileStringW(L"声母",L"sh",NULL,strTitle,MAX_PATH,strFilePath); USES_CONVERSION; char* szTitle = W2A(strTitle); char* szSh = W2A(strSh); char* szCh = W2A(strCh); TRACE("strTitle = %s . strCh = %s, strSh = %s",szTitle,szCh,szSh); }
|
注册表编程
注册表存储在二进制文件里面,win32 API提供了大量的函数操作注册表。
创建注册表
1 2 3 4 5 6 7 8
| RegCreateKeyW ( _In_ HKEY hKey, _In_opt_ LPCWSTR lpSubKey, _Out_ PHKEY phkResult );
|
打开注册表
1 2 3 4 5
| RegOpenKeyW ( _In_ HKEY hKey, _In_opt_ LPCWSTR lpSubKey, _Out_ PHKEY phkResult );
|
写入注册表
1 2 3 4 5 6 7 8 9 10 11 12
| RegSetValueW ( _In_ HKEY hKey, _In_opt_ LPCWSTR lpSubKey, _In_ DWORD dwType, _In_reads_bytes_opt_(cbData) LPCWSTR lpData, _In_ DWORD cbData );
|
扩展——设置注册表项下指定值的数据和类型
1 2 3 4 5 6 7 8 9 10 11 12
| RegSetValueExW( _In_ HKEY hKey, _In_opt_ LPCWSTR lpValueName, _Reserved_ DWORD Reserved, _In_ DWORD dwType, _In_reads_bytes_opt_(cbData) CONST BYTE* lpData, _In_ DWORD cbData );
|
从注册表中读取数据
1 2 3 4 5 6 7 8
| 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 );
|
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| void CMFCFileView::OnWriteReg() { HKEY hKey; DWORD dwAge = 20; int ret = ::RegCreateKeyW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Doraemon\\admin", &hKey); if (ret) { TRACE("RegCreateKeyW Failed,ErrorCode = %d", GetLastError()); MessageBox(L"创建注册表失败"); return; } ret = ::RegSetValueEx(hKey, L"age", 0, REG_DWORD, (CONST BYTE*) & dwAge, 4); if (ret != ERROR_SUCCESS) { TRACE("RegCreateKeyW Failed,ErrorCode = %d", GetLastError()); MessageBox(L"写注册表失败"); return; } ::RegCloseKey(hKey); }
void CMFCFileView::OnReadReg() {
HKEY hKey; DWORD dwAge; int ret = ::RegCreateKeyW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Doraemon\\admin", &hKey); if (ret) { TRACE("RegOpenKeyW Failed,ErrorCode = %d", GetLastError()); MessageBox(L"打开注册表失败"); return; } DWORD dwType; DWORD dwValue;
ret = ::RegQueryValueEx(hKey, L"age", 0, &dwType, (LPBYTE) & dwAge, &dwValue); if (ret != ERROR_SUCCESS) { TRACE("RegQueryValueEx Failed,ErrorCode = %d", GetLastError()); MessageBox(L"读注册表失败"); return; } TRACE("dwType = %d,dwValue = %d,dwAge = %d",dwType,dwValue,dwAge); ::RegCloseKey(hKey); }
|
文件操作的实际应用
- 调试日志debugview,文件日志:警告日志、错误日志。
- 视频存储
- 文件传输CFile和socket结合使用
- C语言和MFC的文件操作用途广泛,Win32 API、ifstream,ofstream用的少。
- 配置文件windows
- 注册表操作-病毒-逆向