|
|
//------------------------------------------------------------------------------------------
// CFileManager.cpp
//
// A managing map files.
//
// Created By: aarayas
//
// History: 01/12/2001
//
//------------------------------------------------------------------------------------------
#include "CFileManager.h"
//------------------------------------------------------------------------------------------
// CFileManager::CFileManager
//
// Initialize a CFileManager
//
//--------------------------------------------------------------------------- aarayas ------
CFileManager::CFileManager() { m_fFileOpen = false; m_hFile = NULL; m_hFileMap = NULL; m_dwFileSize1 = 0; m_dwFileSize2 = 0; m_pMem = NULL; }
//------------------------------------------------------------------------------------------
// CFileManager::CFileManager
//
// Initialize a CFileManager
//
//--------------------------------------------------------------------------- aarayas ------
CFileManager::~CFileManager() { if (m_fFileOpen) { Close(); } }
//------------------------------------------------------------------------------------------
// CFileManager::Load
//
// Load file.
//
//--------------------------------------------------------------------------- aarayas ------
bool CFileManager::Load(const WCHAR* pwszFileName, void** pMem, unsigned int* size) { // Open files.
m_hFile = CMN_CreateFileW(pwszFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (m_hFile != INVALID_HANDLE_VALUE) { m_dwFileSize1 = CMN_GetFileSize(m_hFile, &m_dwFileSize2); if (m_dwFileSize1 != 0 && m_dwFileSize1 != 0xFFFFFFFF) { m_hFileMap = CMN_CreateFileMapping(m_hFile, NULL, PAGE_READONLY, 0, 0, NULL);
if (m_hFileMap != NULL) { m_pMem = CMN_MapViewOfFile(m_hFileMap, FILE_MAP_READ, 0, 0, 0);
if (m_pMem != NULL) { // Create new size.
*size = m_dwFileSize1; *pMem = m_pMem; m_fFileOpen = true; return true; } CMN_CloseHandle(m_hFileMap); } } CMN_CloseHandle(m_hFile); }
m_hFileMap = NULL; m_hFile = NULL; m_dwFileSize1 = 0; m_dwFileSize2 = 0;
return false; }
//------------------------------------------------------------------------------------------
// CFileManager::Close
//
// Close file.
//
//--------------------------------------------------------------------------- aarayas ------
bool CFileManager::Close() { if (m_fFileOpen) { m_fFileOpen = false;
if (m_pMem && !CMN_UnmapViewOfFile(m_pMem)) { return false; }
m_pMem = 0;
if (m_hFileMap && !CMN_CloseHandle(m_hFileMap)) { return false; }
m_hFileMap = 0;
if (!CMN_CloseHandle(m_hFile)) { return false; }
m_hFile = 0; m_dwFileSize1 = 0; m_dwFileSize2 = 0; } return true; }
//------------------------------------------------------------------------------------------
// CFileManager::CreateFile
//
// Create Files
//
//--------------------------------------------------------------------------- aarayas ------
bool CFileManager::CreateFile(const WCHAR* pwszFileName, bool fWrite) { bool fRet = true;
if (fWrite) m_hFile = CMN_CreateFileW( pwszFileName, GENERIC_WRITE, 0, (LPSECURITY_ATTRIBUTES)0,CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, (HANDLE)0); else m_hFile = CMN_CreateFileW( pwszFileName, GENERIC_READ, 0, (LPSECURITY_ATTRIBUTES)0,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, (HANDLE)0);
if (m_hFile == INVALID_HANDLE_VALUE || m_hFile == 0) { m_hFile = 0; m_fFileOpen = false; fRet = false; } else m_fFileOpen = true;
return fRet; }
//------------------------------------------------------------------------------------------
// CFileManager::MovePointer
//
// Move file pointer
// Parameter:
// dwMoveMethod
// FILE_BEGIN - The starting point is zero or the beginning of the file.
// FILE_CURRENT - The starting point is the current value of the file pointer.
// FILE_END - The starting point is the current end-of-file position.
//
//--------------------------------------------------------------------------- aarayas ------
bool CFileManager::MovePointer(DWORD dwMoveMethod) { bool fRet = false;
if (m_fFileOpen && m_hFile) { if (SetFilePointer( m_hFile, // handle of file
0, // number of bytes to move file pointer
0, // address of high-order word of distance to move
dwMoveMethod // how to move
) == 0) { fRet = true; } }
return fRet; }
//------------------------------------------------------------------------------------------
// CFileManager::Write
//
// Write to files.
//
//--------------------------------------------------------------------------- aarayas ------
bool CFileManager::Write(const void* lpBuffer,DWORD nNumberOfBytesToWrite) { bool fRet = false;
if (m_fFileOpen && m_hFile) { DWORD cb;
if (WriteFile(m_hFile, (LPCVOID)lpBuffer, nNumberOfBytesToWrite, &cb, (LPOVERLAPPED)0)) { if (cb == nNumberOfBytesToWrite) fRet = true; } }
return fRet; }
//------------------------------------------------------------------------------------------
// CFileManager::Read
//
// Write to files.
//
//--------------------------------------------------------------------------- aarayas ------
bool CFileManager::Read(void* lpBuffer,DWORD nNumberOfBytesToRead) { bool fRet = false;
if (m_fFileOpen && m_hFile) { DWORD cb;
if (ReadFile(m_hFile, (void*)lpBuffer, nNumberOfBytesToRead, &cb, (LPOVERLAPPED)0)) { if (cb == nNumberOfBytesToRead) fRet = true; } }
return fRet; }
|