📄 page04fileops.cpp
字号:
/*****************************************************************************/
/* Page04FileOps.cpp Copyright (c) Ladislav Zezula 2004 */
/*---------------------------------------------------------------------------*/
/* Description: */
/*---------------------------------------------------------------------------*/
/* Date Ver Who Comment */
/* -------- ---- --- ------- */
/* 19.04.04 1.00 Lad The first version of Page04FileOps.cpp */
/*****************************************************************************/
#include "FileTest.h"
#include "resource.h"
//-----------------------------------------------------------------------------
// Helper functions
extern TFlagInfo FileAttributesValues[];
static BOOL CopyFileByHand(const TCHAR * szOrigFile, const TCHAR * szNewFile)
{
FILETIME ft1;
FILETIME ft2;
FILETIME ft3;
HANDLE hFile1 = INVALID_HANDLE_VALUE;
HANDLE hFile2 = INVALID_HANDLE_VALUE;
int nError = ERROR_SUCCESS;
// Open the original file
if(nError == ERROR_SUCCESS)
{
hFile1 = CreateFile(szOrigFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
if(IsHandleInvalid(hFile1))
nError = GetLastError();
}
// (Re)create the new file
if(nError == ERROR_SUCCESS)
{
hFile2 = CreateFile(szNewFile, GENERIC_READ | GENERIC_WRITE | DELETE | WRITE_DAC, 0, NULL, OPEN_ALWAYS, 0, NULL);
if(IsHandleInvalid(hFile2))
nError = GetLastError();
}
// Get the file time of the original file
if(nError == ERROR_SUCCESS)
{
if(!GetFileTime(hFile1, &ft1, &ft2, &ft3))
nError = GetLastError();
}
// Copy the content
if(nError == ERROR_SUCCESS)
{
BYTE * pbBuffer = NULL;
DWORD dwBufferSize = 0x10000;
DWORD dwTransferred = 1;
pbBuffer = new BYTE [dwBufferSize];
while(dwTransferred != 0)
{
ReadFile(hFile1, pbBuffer, dwBufferSize, &dwTransferred, NULL);
if(dwTransferred != 0)
WriteFile(hFile2, pbBuffer, dwTransferred, &dwTransferred, NULL);
}
delete pbBuffer;
}
// Get the file time of the original file
if(nError == ERROR_SUCCESS)
{
if(!SetFileTime(hFile2, &ft1, &ft2, &ft3))
nError = GetLastError();
}
// Close both files
if(IsHandleValid(hFile2))
CloseHandle(hFile2);
if(IsHandleValid(hFile1))
CloseHandle(hFile1);
if(nError != ERROR_SUCCESS)
{
SetLastError(nError);
return FALSE;
}
return TRUE;
}
static int SaveDialog(HWND hDlg)
{
TPropSheetData * pData = (TPropSheetData *)GetWindowLongPtr(hDlg, DWLP_USER);
// Save the PAGE_XXXX flags for file mapping
pData->dwPageAccess = 0;
if(IsDlgButtonChecked(hDlg, IDC_PAGE_READONLY))
pData->dwPageAccess = PAGE_READONLY;
if(IsDlgButtonChecked(hDlg, IDC_PAGE_READWRITE))
pData->dwPageAccess = PAGE_READWRITE;
// Save the FILE_MAP_XXX for file mapping
pData->dwMapAccess = 0;
if(IsDlgButtonChecked(hDlg, IDC_FILE_MAP_READ))
pData->dwMapAccess |= FILE_MAP_READ;
if(IsDlgButtonChecked(hDlg, IDC_FILE_MAP_WRITE))
pData->dwMapAccess |= FILE_MAP_WRITE;
if((pData->dwCreateOptions & FILE_OPEN_BY_FILE_ID) == 0)
GetDlgItemText(hDlg, IDC_FILE_NAME1, pData->szFileName1, _tsize(pData->szFileName1));
GetDlgItemText(hDlg, IDC_FILE_NAME2, pData->szFileName2, _tsize(pData->szFileName2));
return ERROR_SUCCESS;
}
// This function enables/disables the buttons for map operations
static int UpdateDialogButtons(HWND hDlg)
{
TPropSheetData * pData = (TPropSheetData *)GetWindowLongPtr(hDlg, DWLP_USER);
EnableWindow(GetDlgItem(hDlg, IDC_MAP_FILE), IsHandleValid(pData->hFile));
EnableWindow(GetDlgItem(hDlg, IDC_ACCESS_DATA_READ), (pData->pvFile != NULL));
EnableWindow(GetDlgItem(hDlg, IDC_ACCESS_DATA_WRITE), (pData->pvFile != NULL));
EnableWindow(GetDlgItem(hDlg, IDC_UNMAP_FILE), (pData->pvFile != NULL || IsHandleValid(pData->hMap)));
EnableWindow(GetDlgItem(hDlg, IDC_FLUSH_FILE_BUFFERS), IsHandleValid(pData->hFile));
return TRUE;
}
//-----------------------------------------------------------------------------
// Message handlers
static int OnInitDialog(HWND hDlg, LPARAM lParam)
{
PROPSHEETPAGE * pPage = (PROPSHEETPAGE *)lParam;
LARGE_INTEGER LargeZero = {0};
SetWindowLongPtr(hDlg, DWLP_USER, (LONG)pPage->lParam);
Button_SetCheck(GetDlgItem(hDlg, IDC_USE_COPYAPI), BST_CHECKED);
Hex2DlgText64(hDlg, IDC_FILE_POSITION, LargeZero);
Hex2DlgText32(hDlg, IDC_DATA_LENGTH, 0x10000);
return TRUE;
}
static int OnSetActive(HWND hDlg)
{
TPropSheetData * pData = (TPropSheetData *)GetWindowLongPtr(hDlg, DWLP_USER);
TCHAR * szName;
int nChecked;
if((pData->dwCreateOptions & FILE_OPEN_BY_FILE_ID) == 0)
{
szName = pData->szFileName1;
if(!_tcsncmp(szName, _T("\\??\\"), 4))
szName += 4;
SetDlgItemText(hDlg, IDC_FILE_NAME1, szName);
}
else
{
pData->szDirName[0] = 0;
pData->dwCreateOptions &= ~FILE_OPEN_BY_FILE_ID;
}
if(pData->szFileName2[0] != 0)
SetDlgItemText(hDlg, IDC_FILE_NAME2, pData->szFileName2);
// Set the page attributes for file mapping
nChecked = (pData->dwPageAccess == PAGE_READONLY) ? BST_CHECKED : BST_UNCHECKED;
CheckDlgButton(hDlg, IDC_PAGE_READONLY, nChecked);
nChecked = (pData->dwPageAccess == PAGE_READWRITE) ? BST_CHECKED : BST_UNCHECKED;
CheckDlgButton(hDlg, IDC_PAGE_READWRITE, BST_UNCHECKED);
// Set the access attributes for file mapping
nChecked = (pData->dwMapAccess & FILE_MAP_READ) ? BST_CHECKED : BST_UNCHECKED;
CheckDlgButton(hDlg, IDC_FILE_MAP_READ, nChecked);
nChecked = (pData->dwMapAccess & FILE_MAP_WRITE) ? BST_CHECKED : BST_UNCHECKED;
CheckDlgButton(hDlg, IDC_FILE_MAP_WRITE, BST_UNCHECKED);
UpdateDialogButtons(hDlg);
return TRUE;
}
static int OnKillActive(HWND hDlg)
{
SaveDialog(hDlg);
UpdateDialogButtons(hDlg);
return TRUE;
}
static int OnDeltaPos(HWND hDlg, NMUPDOWN * pNMHDR)
{
LARGE_INTEGER Uint64;
DWORD Uint32;
// Get the proper edit box
if(pNMHDR->hdr.idFrom == IDC_SPIN_FILEPOS)
{
Uint64 = DlgText2Hex64(hDlg, IDC_FILE_POSITION);
if(pNMHDR->iDelta < 0)
Uint64.QuadPart += 0x10000;
else
Uint64.QuadPart -= 0x10000;
if(Uint64.HighPart & 0x80000000)
Uint64.QuadPart = 0;
Hex2DlgText64(hDlg, IDC_FILE_POSITION, Uint64);
return TRUE;
}
if(pNMHDR->hdr.idFrom == IDC_SPIN_DATALEN)
{
Uint32 = DlgText2Hex32(hDlg, IDC_DATA_LENGTH);
if(pNMHDR->iDelta < 0)
Uint32 += 0x10000;
else
Uint32 -= 0x10000;
if(Uint32 & 0x80000000)
Uint32 = 0;
Hex2DlgText32(hDlg, IDC_DATA_LENGTH, Uint32);
return TRUE;
}
return FALSE;
}
static int OnCopyFileClick(HWND hDlg)
{
TPropSheetData * pData = (TPropSheetData *)GetWindowLongPtr(hDlg, DWLP_USER);
BOOL bUseCopyFile = FALSE;
BOOL bResult = FALSE;
int nError = ERROR_SUCCESS;
// Decide whether we have to copy by hand or not
SaveDialog(hDlg);
bUseCopyFile = (Button_GetCheck(GetDlgItem(hDlg, IDC_USE_COPYAPI)) == BST_CHECKED);
// Perform the copy
if(nError == ERROR_SUCCESS)
{
GetDlgItemText(hDlg, IDC_FILE_NAME1, pData->szFileName1, _tsize(pData->szFileName1));
GetDlgItemText(hDlg, IDC_FILE_NAME2, pData->szFileName2, _tsize(pData->szFileName2));
if(bUseCopyFile)
bResult = CopyFile(pData->szFileName1, pData->szFileName2, FALSE);
else
bResult = CopyFileByHand(pData->szFileName1, pData->szFileName2);
if(bResult == FALSE)
nError = GetLastError();
}
// Set the result
SetLastErrorText(hDlg, IDC_LAST_ERROR, nError);
return TRUE;
}
static int OnMoveFileClick(HWND hDlg)
{
TPropSheetData * pData = (TPropSheetData *)GetWindowLongPtr(hDlg, DWLP_USER);
DWORD dwMoveOptions = MOVEFILE_COPY_ALLOWED;
int nError = ERROR_SUCCESS;
SaveDialog(hDlg);
if(IsDlgButtonChecked(hDlg, IDC_REPLACE_EXISTING))
dwMoveOptions |= MOVEFILE_REPLACE_EXISTING;
// Perform the rename
if(!MoveFileEx(pData->szFileName1, pData->szFileName2, dwMoveOptions))
nError = GetLastError();
// Set the result
SetLastErrorText(hDlg, IDC_LAST_ERROR, nError);
return TRUE;
}
static int OnMapFileClick(HWND hDlg)
{
TPropSheetData * pData = (TPropSheetData *)GetWindowLongPtr(hDlg, DWLP_USER);
LARGE_INTEGER StartOffset = {0};
LARGE_INTEGER MaxMapSize;
int nError = ERROR_SUCCESS;
SaveDialog(hDlg);
// Create the file mapping object
if(nError == ERROR_SUCCESS)
{
StartOffset = DlgText2Hex64(hDlg, IDC_FILE_POSITION);
pData->dwMapped = DlgText2Hex32(hDlg, IDC_DATA_LENGTH);
// Get the maximum map size
MaxMapSize.QuadPart = StartOffset.QuadPart;
MaxMapSize.QuadPart += pData->dwMapped;
if(IsHandleInvalid(pData->hMap))
pData->hMap = CreateFileMapping(pData->hFile, NULL, pData->dwPageAccess, MaxMapSize.HighPart, MaxMapSize.LowPart, NULL);
if(IsHandleInvalid(pData->hMap))
nError = GetLastError();
}
// Map view of file
if(nError == ERROR_SUCCESS)
{
if(pData->pvFile == NULL)
pData->pvFile = MapViewOfFile(pData->hMap, pData->dwMapAccess, StartOffset.HighPart, StartOffset.LowPart, pData->dwMapped);
if(pData->pvFile == NULL)
nError = GetLastError();
}
UpdateDialogButtons(hDlg);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -