2006年写的,备用
class CS_MemFileStream
{
public:
enum CS_MemFileStream_State
{Normal,Error,In,Out,Open,Close};
public:
CS_MemFileStream();
~CS_MemFileStream();
inline void open(CString &sFileName,const int mode = ios::in)
{open(sFileName.GetBuffer(0),mode);}
void open(char *pcFileName,const int mode = ios::in);
void read_block();
inline void close()
{
if(lpvFile) UnmapViewOfFile(lpvFile);
if(hMap) CloseHandle(hMap);
if(hFile) CloseHandle(hFile);
hFile = NULL;
hMap = NULL;
lpvFile = NULL;
}
inline int eof(){return iState==Error;}
//
void getline(char *pDest, int iMaxSize,UCHAR cFlag = 0xA);
private:
HANDLE hFile; // File handle
HANDLE hMap; // File mapping handle
LPVOID lpvFile;
long pos;
long file_size;//all
long keep_size;//not read
long read_size;//read one block or less
long sys_granularity;
int iState;
};
#include "stdafx.h"
#include "S_MemFileStream.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CS_MemFileStream::CS_MemFileStream()
: hFile(NULL),
hMap(NULL),
lpvFile(NULL),
iState(Normal),
file_size(0),
keep_size(0),
read_size(0),
pos(0)
{
}
CS_MemFileStream::~CS_MemFileStream()
{
close();
}
void CS_MemFileStream::open(char *pcFileName,const int mode)
{
hFile = CreateFile
(pcFileName, GENERIC_READ, 0, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_READONLY, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
hFile = NULL;
hMap = NULL;
lpvFile = NULL;
iState = Error;
return;
}
hMap = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
if (hMap == NULL)
{
CloseHandle(hFile);
hFile = NULL;
hMap = NULL;
lpvFile = NULL;
iState = Error;
return;
}
//
DWORD dwFileSizeHigh;
file_size = GetFileSize(hFile, &dwFileSizeHigh);
keep_size = file_size;
if(dwFileSizeHigh)
{
iState = Error;
}
//
#if defined(ReadStandardGDFFile)
CSASSERT(false,"file name:%s",pcFileName);
CSASSERT(false,"file size:%d bytes",file_size);
ASSERT(file_size%82 == 0);//标准GDF文件
#endif
//
SYSTEM_INFO sysInfor;
GetSystemInfo(&sysInfor);
sys_granularity = sysInfor.dwAllocationGranularity;
sys_granularity <<= 10;
//
if(keep_size < sys_granularity)
{
read_size = keep_size;
}
else
{
read_size = sys_granularity;
}
lpvFile = MapViewOfFile
(hMap, FILE_MAP_READ, 0, file_size-keep_size, read_size);
keep_size -= read_size;
if (lpvFile == NULL)
{
TRACE("映射文件映射失败,错误代码:%d\r\n",GetLastError());
CloseHandle(hMap);
CloseHandle(hFile);
hFile = NULL;
hMap = NULL;
lpvFile = NULL;
iState = Error;
return;
}
//
return;
}
void CS_MemFileStream::read_block()
{
pos = 0;
if(lpvFile)
{
UnmapViewOfFile(lpvFile);
lpvFile = NULL;
}
if(keep_size > 0)
{
if(keep_size<sys_granularity)
{
read_size = keep_size;
}
else
{
read_size = sys_granularity;
}
lpvFile = MapViewOfFile
(hMap, FILE_MAP_READ, 0, file_size-keep_size, read_size);
keep_size -= read_size;
if (lpvFile == NULL)
{
TRACE("映射文件映射失败,错误代码:%d\r\n",GetLastError());
CloseHandle(hMap);
CloseHandle(hFile);
hFile = NULL;
hMap = NULL;
lpvFile = NULL;
iState = Error;
return;
}
}
else
{
read_size = 0;
iState = Error;
return;
}
}
void CS_MemFileStream::getline(char *pDest, int iMaxSize,UCHAR cFlag)
{
#if !defined(ReadStandardGDFFile)
char *pTemp = ((char *)lpvFile)+pos;
while(iMaxSize--)
{
if(pos++>read_size)
{
read_block();
if(eof())
return;
}
if(*pTemp != cFlag)
{
*pDest++ = *pTemp++;
}
else
{
*pDest = 0;
return;
}
}
#else
if(pos+82<=read_size)
{
memcpy(pDest , ((BYTE *)lpvFile + pos) , 80);
*(pDest+80) = 0;
pos += 82;
}
else
{
char *pDestTemp = pDest;
memcpy(pDestTemp , ((BYTE *)lpvFile + pos) , read_size-pos);
pDestTemp += (read_size-pos);
read_block();
if(eof())
return;
memcpy(pDestTemp , ((BYTE *)lpvFile + pos) , pDest+82-pDestTemp);
*(pDest+80) = 0;
pos += (pDest+82-pDestTemp);
}
#endif
}