创建一个打开窗口,并执行文件内容反转,并且把反转后的内容在记事本展示。
void CFileReverseDlg::OnBnClickedFileRevereButton()
{
// TODO: 在此添加控件通知处理程序代码
BOOL bIsTextUnicode;
BOOL bRet;
CString Filename;
m_filePath.GetWindowTextW(Filename);
if (!Filename.IsEmpty())
{
CopyFile(Filename, FILENAME, FALSE);
bRet = FileReverse(FILENAME, bIsTextUnicode);
if (bRet)
{
if (bIsTextUnicode)
{
AfxMessageBox(_T("文件字符编码方式为UNICODE。"));
}
else
{
AfxMessageBox(_T("文件字符编码方式为ANSI。"));
}
}
STARTUPINFO si = { sizeof(si) };
PROCESS_INFORMATION pi;
TCHAR sz[] = TEXT("Notepad ") FILENAME;
if (CreateProcess(NULL, sz, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
{
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
}
}
}
文件映射内容反转实现:
BOOL CFileReverseDlg::FileReverse(const CString PathName, BOOL& bIsTextUnicode)
{
bIsTextUnicode = FALSE;
HANDLE hFile = CreateFile(PathName, GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
AfxMessageBox(_T("File could not be opened."));
return FALSE;
}
DWORD dwFileSize = GetFileSize(hFile, NULL);
HANDLE hFileMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0,
dwFileSize + sizeof(WCHAR), NULL);
if (hFileMap == nullptr)
{
AfxMessageBox(_T("File map could not be opened."));
CloseHandle(hFile);
return FALSE;
}
PVOID pvFile = MapViewOfFile(hFileMap, FILE_MAP_WRITE, 0, 0, 0);
if (pvFile == NULL)
{
AfxMessageBox(_T("Could not map view of file."));
CloseHandle(hFileMap);
CloseHandle(hFile);
return FALSE;
}
int iUnicodeTestFlags = -1;
bIsTextUnicode = IsTextUnicode(pvFile, dwFileSize, &iUnicodeTestFlags);
if (!bIsTextUnicode)
{
PSTR pchANSI = (PSTR)pvFile;
pchANSI[dwFileSize / sizeof(CHAR)] = 0;
_strrev(pchANSI);
pchANSI = strstr(pchANSI, "\n\r");
while (pchANSI != NULL)
{
*pchANSI++ = '\r';
*pchANSI++ = '\n';
pchANSI = strstr(pchANSI, "\n\r");
}
}
else
{
PWSTR pchUnicode = (PWSTR)pvFile;
pchUnicode[dwFileSize / sizeof(WCHAR)] = 0;
if ((iUnicodeTestFlags & IS_TEXT_UNICODE_SIGNATURE) != 0)
{
pchUnicode++;
}
_wcsrev(pchUnicode);
pchUnicode = wcsstr(pchUnicode, _T("\n\r"));
while (pchUnicode != nullptr)
{
*pchUnicode++ = _T('\r');
*pchUnicode++ = _T('\n');
pchUnicode = wcsstr(pchUnicode, _T("\n\r"));
}
}
UnmapViewOfFile(pvFile);
CloseHandle(hFileMap);
SetFilePointer(hFile, dwFileSize, NULL, FILE_BEGIN);
SetEndOfFile(hFile);
CloseHandle(hFile);
return TRUE;
}