⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 page04fileops.cpp

📁 This ZIP archive includes the sources (and executable) for the FileTest utility, written by Ladisla
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/*****************************************************************************/
/* 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 + -