250 lines
7.5 KiB
C
250 lines
7.5 KiB
C
|
#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
|