|
|
#ifndef _FILEIO_H
#define _FILEIO_H
#define WIN32_MEAN_AND_LEAN
#define WIN32_EXTRA_LEAN
class CFileIO { public: CFileIO(LPCTSTR szFileName = NULL) { m_hFile = NULL; m_TotalFileSize = 0; Open(szFileName); }
~CFileIO() { Close(); } ////////////////////////////////////////////////////////////////////
//
// Function Name: Open()
// Purpose: open a given file, for reading and writing
// Parameters:
// LPCTSTR szFileName - File name to open
//
////////////////////////////////////////////////////////////////////
HRESULT Open(LPCTSTR szFileName, BOOL bCreate = FALSE){ if(NULL != szFileName){ DWORD dwOpen = OPEN_EXISTING; if(bCreate){ dwOpen = OPEN_ALWAYS; } m_hFile = CreateFile(szFileName, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, dwOpen, FILE_ATTRIBUTE_NORMAL, NULL); BY_HANDLE_FILE_INFORMATION FileInfo; memset(&FileInfo,0,sizeof(BY_HANDLE_FILE_INFORMATION)); GetFileInformationByHandle(m_hFile,&FileInfo); m_TotalFileSize = FileInfo.nFileSizeLow; } m_bReady = (INVALID_HANDLE_VALUE != m_hFile); if(m_bReady) return S_OK; return E_FAIL; }
////////////////////////////////////////////////////////////////////
//
// Function Name: FileSize()
// Purpose: return the file size of the currently opened file
// Parameters: none
//
////////////////////////////////////////////////////////////////////
LONG FileSize(){ return m_TotalFileSize; }
////////////////////////////////////////////////////////////////////
//
// Function Name: EraseFile()
// Purpose: erase file contents, by resetting the EOF
// Parameters: none
//
////////////////////////////////////////////////////////////////////
VOID EraseFile(){ SetEndOfFile(m_hFile); }
////////////////////////////////////////////////////////////////////
//
// Function Name: WriteEOL()
// Purpose: write a carriage return, line feed to the file
// Parameters: none
//
////////////////////////////////////////////////////////////////////
BOOL WriteEOL(){ DWORD dwBytesWritten = 0; TCHAR EndOfLine[2]; EndOfLine[0] = TEXT('\r'); EndOfLine[1] = TEXT('\n'); return WriteFile(EndOfLine,2,&dwBytesWritten,NULL); } ////////////////////////////////////////////////////////////////////
//
// Function Name: Close()
// Purpose: close the opened file
// Parameters: none
//
////////////////////////////////////////////////////////////////////
VOID Close(){ if(NULL != m_hFile){ CloseHandle(m_hFile); m_hFile = NULL; } }
////////////////////////////////////////////////////////////////////
//
// Function Name: ReadLine()
// Purpose: read a text line from a text-base file
// Parameters:
// LPTSTR szTextLine - buffer for text line data
// LONG lBufferSize - size of szTextLine buffer
// PLONG pNumTCHARs - number of characters read (can be NULL)
//
////////////////////////////////////////////////////////////////////
BOOL ReadLine (LPTSTR szTextLine, LONG lBufferSize, PLONG pNumTCHARs){ TCHAR ch = TEXT(' '); LONG index = 0; DWORD dwBytesRead = 1; DWORD dwTotalBytesRead = 0; memset(szTextLine,0,lBufferSize); while(ch != TEXT('\r') && ch != TEXT('\n') && dwBytesRead > 0) {
if(!ReadFile(&ch,sizeof(TCHAR),&dwBytesRead,NULL)){ return FALSE; } if(dwBytesRead > 0){ szTextLine[index] = ch; dwTotalBytesRead += dwBytesRead; index++; } }
//
// rip to next line...
//
while(ch == TEXT('\r') && dwBytesRead > 0){ ch = TEXT(' '); if(!ReadFile(&ch,sizeof(TCHAR),&dwBytesRead,NULL)) { return FALSE; } }
if(NULL != pNumTCHARs){ *pNumTCHARs = 0; *pNumTCHARs = (dwTotalBytesRead/sizeof(TCHAR)); } if(dwTotalBytesRead > 0) return TRUE; return FALSE; } BOOL WriteLine(LPTSTR szTextLine){ DWORD dwBytesWritten = 0; if(WriteFile((LPCVOID)szTextLine,(lstrlen(szTextLine) * sizeof(TCHAR)),&dwBytesWritten,NULL)){ return WriteFile((LPCVOID)TEXT("\r\n"),(2* sizeof(TCHAR)),&dwBytesWritten,NULL); } else { return FALSE; } } ////////////////////////////////////////////////////////////////////
//
// Function Name: ReadFile()
// Purpose: read data from a file
// Parameters:
// LPVOID lpBuffer - buffer to fill with data
// DWORD nNumberOfBytesToRead - number of bytes to read
// LPDWORD lpNumberOfBytesRead - number of bytes read
// LPOVERLAPPED lpOverlapped - overlap
//
////////////////////////////////////////////////////////////////////
BOOL ReadFile(LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped){ if(!m_bReady){ return FALSE; } return ::ReadFile(m_hFile,lpBuffer,nNumberOfBytesToRead, lpNumberOfBytesRead,lpOverlapped); } ////////////////////////////////////////////////////////////////////
//
// Function Name: WriteFile()
// Purpose: write data to a file
// Parameters:
// LPCVOID lpBuffer - buffer to write to a file
// DWORD nNumberOfBytesToWrite - number of bytes to write
// LPDWORD lpNumberOfBytesWritten - number of bytes written
// LPOVERLAPPED lpOverlapped - overlap
//
////////////////////////////////////////////////////////////////////
BOOL WriteFile(LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped){ if(!m_bReady){ return FALSE; } return ::WriteFile(m_hFile,lpBuffer,nNumberOfBytesToWrite, lpNumberOfBytesWritten,lpOverlapped); }
////////////////////////////////////////////////////////////////////
//
// Function Name: SeekFile()
// Purpose: move current file pointer
// Parameters:
// DWORD dwBytesToSeek - number of bytes to move file pointer
// DWORD dwMoveMethod - method of moving file pointer
// [Valid dwMoveMethods]
// FILE_BEGIN - from the beginning of the file
// FILE_CURRENT - from the current file position
// FILE_END - from the end of the file
//
////////////////////////////////////////////////////////////////////
BOOL SeekFile(DWORD dwBytesToSeek, DWORD dwMoveMethod){ DWORD dwFilePointer = 0; dwFilePointer = SetFilePointer(m_hFile,dwBytesToSeek,NULL,dwMoveMethod); if (dwFilePointer == 0xFFFFFFFF) return FALSE; return TRUE; } private: HANDLE m_hFile; // file handle
BOOL m_bReady; // cfileio class ready flag
LONG m_TotalFileSize; // file size (bytes)
protected: };
#endif
|