#include #include #include //#include #include class FileInfo; extern "C" { int FileOpen(char *pPathFileName,FileInfo *pFileInfo,int access,int share,int open,int attributes); int FileClose(FileInfo *pFileInfo); int FileRead(FileInfo *pFileInfo,BYTE *ptrByte); int FileReadLine(FileInfo *pFileInfo,BYTE *ptrByte); int FileWriteLine(FileInfo *pFileInfo,BYTE *ptrByte); int FileFlush(FileInfo *pFileInfo); } class FileInfo { public: FileInfo(void); ~FileInfo(); // cannot be virtual enum{MaxLength=0x800}; BYTE mBuffer[MaxLength]; HANDLE mhFileHandle; DWORD mBufferIndex; DWORD mlpBufferPointer; }; inline FileInfo::FileInfo(void) : mhFileHandle(INVALID_HANDLE_VALUE), mBufferIndex(0), mlpBufferPointer(0) { } inline FileInfo::~FileInfo() { } class FileIO { public: enum Open{CreateNew=CREATE_NEW,CreateAlways=CREATE_ALWAYS,OpenExisting=OPEN_EXISTING, OpenAlways=OPEN_ALWAYS,TruncateExisting=TRUNCATE_EXISTING}; enum Share{FileShareRead=FILE_SHARE_READ,FileShareWrite=FILE_SHARE_WRITE,FileShareDelete=FILE_SHARE_DELETE}; enum Access{GenericRead=GENERIC_READ,GenericWrite=GENERIC_WRITE, GenericExecute=GENERIC_EXECUTE,GenericAll=GENERIC_ALL}; enum Attributes{ReadOnly=FILE_ATTRIBUTE_READONLY,Hidden=FILE_ATTRIBUTE_HIDDEN, System=FILE_ATTRIBUTE_SYSTEM,Directory=FILE_ATTRIBUTE_DIRECTORY, Archive=FILE_ATTRIBUTE_ARCHIVE,Normal=FILE_ATTRIBUTE_NORMAL, Temporary=FILE_ATTRIBUTE_TEMPORARY,Compressed=FILE_ATTRIBUTE_COMPRESSED, Offline=FILE_ATTRIBUTE_OFFLINE}; int openFile(char *pPathFileName,Access access,Share share,Open open,Attributes attributes); int closeFile(void); int readFile(BYTE *ptrByte); int readLine(BYTE *strLine); int writeFile(BYTE *strByte); int flushFile(void); BOOL isOkay(void)const; private: FileInfo mFileInfo; }; inline int FileIO::openFile(char *pPathFileName,Access access,Share share,Open open,Attributes attributes) { closeFile(); return !(INVALID_HANDLE_VALUE==(HANDLE)::FileOpen(pPathFileName,&mFileInfo,access,share,open,attributes)); } inline int FileIO::closeFile(void) { flushFile(); return ::FileClose(&mFileInfo); } inline int FileIO::readFile(BYTE *ptrByte) { return ::FileRead(&mFileInfo,ptrByte); } inline int FileIO::readLine(BYTE *strLine) { return ::FileReadLine(&mFileInfo,strLine); } inline int FileIO::writeFile(BYTE *strByte) { return ::FileWriteLine(&mFileInfo,strByte); } inline int FileIO::flushFile(void) { return ::FileFlush(&mFileInfo); } inline BOOL FileIO::isOkay(void)const { return INVALID_HANDLE_VALUE==mFileInfo.mhFileHandle; } int PASCAL WinMain(HINSTANCE /*hInstance*/,HINSTANCE /*hPrevInstance*/,LPSTR lpszCmdLine,int /*nCmdShow*/) { FileIO openFile; BYTE ptrByte; DWORD byteCount; DWORD elapsedTime; String strMessage; char lineString; // if(!openFile.openFile(String(lpszCmdLine), // FileIO::Access(int(FileIO::GenericRead)|int(FileIO::GenericWrite)), // FileIO::FileShareRead, // FileIO::OpenExisting, // FileIO::Normal))return FALSE; //#if 0 if(!openFile.openFile("c:\\smk.lst", FileIO::Access(int(FileIO::GenericRead)|int(FileIO::GenericWrite)), FileIO::FileShareWrite, FileIO::CreateAlways, FileIO::Normal))return FALSE; elapsedTime=::GetTickCount(); for(int lineIndex=0;lineIndex<500000;lineIndex++)openFile.writeFile((BYTE*)"hello there"); elapsedTime=::GetTickCount()-elapsedTime; elapsedTime/=1000L; ::sprintf(strMessage,"%ld bytes read int %ld seconds\n",byteCount,elapsedTime); ::MessageBox(::GetFocus(),strMessage,(LPSTR)"FileIO",MB_OK); openFile.closeFile(); //#endif #if 0 FileHandle logFile; logFile.open("c:\\smk.lst",FileHandle::ReadWrite,FileHandle::ShareReadWrite,FileHandle::Overwrite); if(!logFile.isOkay())return FALSE; elapsedTime=::GetTickCount(); for(int lineIndex=0;lineIndex<500000;lineIndex++)logFile.writeLine("hello there"); logFile.flush(); logFile.close(); elapsedTime=::GetTickCount()-elapsedTime; elapsedTime/=1000L; ::sprintf(strMessage,"%ld bytes read int %ld seconds\n",byteCount,elapsedTime); ::MessageBox(::GetFocus(),strMessage,(LPSTR)"FileIO",MB_OK); #endif return FALSE; }