155 lines
4.1 KiB
C++
155 lines
4.1 KiB
C++
#include <common/windows.hpp>
|
|
#include <common/string.hpp>
|
|
#include <common/openfile.hpp>
|
|
#include <stdio.h>
|
|
|
|
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;
|
|
}
|
|
|