Files
Work/fileio/MAIN.CPP
2024-08-07 09:16:27 -04:00

156 lines
4.2 KiB
C++

#include <common/windows.hpp>
#include <common/string.hpp>
#include <common/openfile.hpp>
//#include <uudecode/fileinfo.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;
}