388 lines
9.5 KiB
C++
388 lines
9.5 KiB
C++
#if defined(__FLAT__)
|
|
#ifndef _COMMON_OPENFILE_HPP_
|
|
#define _COMMON_OPENFILE_HPP_
|
|
#ifndef _COMMON_WINDOWS_HPP_
|
|
#include <common/windows.hpp>
|
|
#endif
|
|
#ifndef _COMMON_STRING_HPP_
|
|
#include <common/string.hpp>
|
|
#endif
|
|
#ifndef _COMMON_FILETIME_HPP_
|
|
#include <common/filetime.hpp>
|
|
#endif
|
|
#ifndef _COMMON_SYSTEMTIME_HPP_
|
|
#include <common/systime.hpp>
|
|
#endif
|
|
#ifndef _COMMON_OVERLAPPED_HPP_
|
|
#include <common/overlap.hpp>
|
|
#endif
|
|
|
|
#if _MSC_VER > 1200
|
|
#pragma warning( disable : 6031 26812)
|
|
#endif
|
|
|
|
class Overlapped;
|
|
|
|
// good for writing files
|
|
|
|
class FileHandle
|
|
{
|
|
public:
|
|
enum {ErrorReturn=0xFFFFFFFF};
|
|
enum Method{SeekBegin=FILE_BEGIN,SeekCurrent=FILE_CURRENT,SeekEnd=FILE_END};
|
|
enum Mode{Create=CREATE_NEW,Overwrite=CREATE_ALWAYS,Open=OPEN_EXISTING};
|
|
enum Share{ShareNone=0,ShareRead=FILE_SHARE_READ,ShareWrite=FILE_SHARE_WRITE,ShareReadWrite=FILE_SHARE_READ|FILE_SHARE_WRITE};
|
|
enum Access{Read=GENERIC_READ,Write=GENERIC_WRITE,ReadWrite=GENERIC_READ|GENERIC_WRITE,Query=0};
|
|
enum Disposition{CloseHandle,AssumedHandle,InvalidHandle};
|
|
enum Attribute{Normal=FILE_ATTRIBUTE_NORMAL,Archive=FILE_ATTRIBUTE_ARCHIVE,
|
|
Hidden=FILE_ATTRIBUTE_HIDDEN,ReadOnly=FILE_ATTRIBUTE_READONLY,
|
|
System=FILE_ATTRIBUTE_SYSTEM,Temporary=FILE_ATTRIBUTE_TEMPORARY,
|
|
FlagDeleteOnClose=FILE_FLAG_DELETE_ON_CLOSE,FlagOverlapped=FILE_FLAG_OVERLAPPED};
|
|
FileHandle(void);
|
|
FileHandle(const String &pathFileName,Access access=ReadWrite,Share share=ShareRead,Mode open=Open,Attribute attribute=Normal);
|
|
FileHandle(const FileHandle &someFileHandle);
|
|
FileHandle(HANDLE hFile);
|
|
virtual ~FileHandle();
|
|
operator HANDLE(void)const;
|
|
FileHandle &operator=(const FileHandle &someFileHandle);
|
|
FileHandle &operator=(HANDLE hFile);
|
|
WORD open(const String &pathFileName,Access access=ReadWrite,Share share=ShareNone,Mode open=Open,Attribute attribute=Normal);
|
|
void close(void);
|
|
WORD isOkay(void)const;
|
|
DWORD seek(long offset,Method seekMethod);
|
|
DWORD tell(void)const;
|
|
DWORD rewind(void)const;
|
|
WORD read(BYTE &someByte)const;
|
|
WORD read(BYTE *lpBytePtr,DWORD dwExtent)const;
|
|
WORD read(DWORD &someDWORD)const;
|
|
BOOL read(BYTE &someByte,Overlapped &overlapped)const;
|
|
BOOL read(BYTE *lpBytePtr,DWORD dwExtent,Overlapped &overlapped)const;
|
|
BOOL read(DWORD &someDWORD,Overlapped &overlapped)const;
|
|
DWORD getLine(String &lineString)const;
|
|
WORD write(const BYTE &someByte)const;
|
|
DWORD write(const String &someString)const;
|
|
DWORD writeLine(const String &someString)const;
|
|
WORD write(BYTE *lpBytePtr,DWORD dwExtent)const;
|
|
WORD write(const DWORD &someDWORD)const;
|
|
WORD write(const WORD &someWORD)const;
|
|
WORD flush(void)const;
|
|
BOOL getOverlappedResult(Overlapped &overlapped,BOOL wait=FALSE)const;
|
|
DWORD size(void)const;
|
|
String pathFileName(void)const;
|
|
Share share(void)const;
|
|
Access access(void)const;
|
|
SystemTime creationTime(void)const;
|
|
SystemTime lastAccessTime(void)const;
|
|
SystemTime lastModifyTime(void)const;
|
|
void disposition(Disposition disposition);
|
|
private:
|
|
enum {CarriageReturn=0x0D,LineFeed=0x0A,TabChar=0x09,NullChar=0x00};
|
|
Disposition disposition(void)const;
|
|
void pathFileName(const String &pathFileName);
|
|
void share(Share share);
|
|
void access(Access access);
|
|
HANDLE mhFileHandle;
|
|
Disposition mDisposition;
|
|
String mPathFileName;
|
|
Share mShare;
|
|
Access mAccess;
|
|
};
|
|
|
|
inline
|
|
FileHandle::FileHandle(void)
|
|
: mhFileHandle(INVALID_HANDLE_VALUE), mDisposition(InvalidHandle),
|
|
mShare(ShareNone), mAccess(ReadWrite)
|
|
{
|
|
}
|
|
|
|
inline
|
|
FileHandle::FileHandle(HANDLE hFile)
|
|
{
|
|
*this=hFile;
|
|
}
|
|
|
|
inline
|
|
FileHandle::FileHandle(const String &pathFileName,Access access,Share share,Mode open,Attribute attribute)
|
|
: mhFileHandle(INVALID_HANDLE_VALUE), mDisposition(InvalidHandle), mPathFileName(pathFileName), mShare(share),
|
|
mAccess(access)
|
|
{
|
|
if(mPathFileName.isNull())return;
|
|
mhFileHandle=::CreateFile(mPathFileName,access,share,(LPSECURITY_ATTRIBUTES)0,open,attribute,(HANDLE)0);
|
|
if(INVALID_HANDLE_VALUE!=mhFileHandle)mDisposition=CloseHandle;
|
|
}
|
|
|
|
inline
|
|
FileHandle::FileHandle(const FileHandle &someFileHandle)
|
|
{
|
|
*this=someFileHandle;
|
|
}
|
|
|
|
inline
|
|
FileHandle::operator HANDLE(void)const
|
|
{
|
|
return mhFileHandle;
|
|
}
|
|
|
|
inline
|
|
FileHandle &FileHandle::operator=(const FileHandle &someFileHandle)
|
|
{
|
|
mhFileHandle=(HANDLE)someFileHandle;
|
|
pathFileName(someFileHandle.pathFileName());
|
|
share(someFileHandle.share());
|
|
access(someFileHandle.access());
|
|
disposition(AssumedHandle);
|
|
return *this;
|
|
}
|
|
|
|
inline
|
|
FileHandle &FileHandle::operator=(HANDLE hFile)
|
|
{
|
|
mhFileHandle=hFile;
|
|
disposition(AssumedHandle);
|
|
share(ShareReadWrite);
|
|
access(ReadWrite);
|
|
return *this;
|
|
}
|
|
|
|
inline
|
|
WORD FileHandle::open(const String &pathFileName,Access access,Share share,Mode open,Attribute attribute)
|
|
{
|
|
close();
|
|
mPathFileName=pathFileName;
|
|
mShare=share;
|
|
mAccess=access;
|
|
if(mPathFileName.isNull())return FALSE;
|
|
mhFileHandle=::CreateFile(mPathFileName,access,share,(LPSECURITY_ATTRIBUTES)0,open,attribute,(HANDLE)0);
|
|
if(INVALID_HANDLE_VALUE!=mhFileHandle)mDisposition=CloseHandle;
|
|
return isOkay();
|
|
}
|
|
|
|
inline
|
|
DWORD FileHandle::seek(long offset,Method seekMethod)
|
|
{
|
|
if(!isOkay())return FALSE;
|
|
return ::SetFilePointer((HANDLE)*this,offset,(PLONG)0,seekMethod);
|
|
}
|
|
|
|
inline
|
|
DWORD FileHandle::tell(void)const
|
|
{
|
|
if(!isOkay())return FALSE;
|
|
return ::SetFilePointer((HANDLE)*this,0L,(PLONG)0,SeekCurrent);
|
|
}
|
|
|
|
inline
|
|
DWORD FileHandle::rewind(void)const
|
|
{
|
|
if(!isOkay())return FALSE;
|
|
return ::SetFilePointer((HANDLE)*this,0L,(PLONG)0,SeekBegin);
|
|
}
|
|
|
|
inline
|
|
BOOL FileHandle::getOverlappedResult(Overlapped &overlapped,BOOL wait)const
|
|
{
|
|
DWORD bytesReadThusFar;
|
|
if(!isOkay())return FALSE;
|
|
return ::GetOverlappedResult(mhFileHandle,&overlapped.getOverlapped(),&bytesReadThusFar,wait);
|
|
}
|
|
|
|
inline
|
|
BOOL FileHandle::read(BYTE &someByte,Overlapped &overlapped)const
|
|
{
|
|
DWORD bytesRead;
|
|
|
|
if(!isOkay())return FALSE;
|
|
return ::ReadFile((HANDLE)*this,&someByte,sizeof(BYTE),&bytesRead,&overlapped.getOverlapped());
|
|
}
|
|
|
|
inline
|
|
BOOL FileHandle::read(BYTE *lpBytePtr,DWORD dwExtent,Overlapped &overlapped)const
|
|
{
|
|
DWORD bytesRead;
|
|
|
|
if(!isOkay())return FALSE;
|
|
return ::ReadFile((HANDLE)*this,lpBytePtr,dwExtent,&bytesRead,&overlapped.getOverlapped());
|
|
}
|
|
|
|
inline
|
|
BOOL FileHandle::read(DWORD &someDWORD,Overlapped &overlapped)const
|
|
{
|
|
DWORD bytesRead;
|
|
|
|
if(!isOkay())return FALSE;
|
|
return ::ReadFile((HANDLE)*this,&someDWORD,sizeof(DWORD),&bytesRead,&overlapped.getOverlapped());
|
|
}
|
|
|
|
inline
|
|
WORD FileHandle::read(BYTE &someByte)const
|
|
{
|
|
DWORD bytesRead;
|
|
|
|
if(!isOkay())return FALSE;
|
|
::ReadFile((HANDLE)*this,&someByte,sizeof(BYTE),&bytesRead,(LPOVERLAPPED)0);
|
|
return sizeof(BYTE)==bytesRead;
|
|
}
|
|
|
|
inline
|
|
WORD FileHandle::read(BYTE *lpBytePtr,DWORD dwExtent)const
|
|
{
|
|
DWORD bytesRead;
|
|
|
|
if(!isOkay())return FALSE;
|
|
::ReadFile((HANDLE)*this,lpBytePtr,dwExtent,&bytesRead,(LPOVERLAPPED)0);
|
|
return bytesRead==dwExtent;
|
|
}
|
|
|
|
inline
|
|
WORD FileHandle::read(DWORD &someDWORD)const
|
|
{
|
|
DWORD bytesRead;
|
|
|
|
if(!isOkay())return FALSE;
|
|
::ReadFile((HANDLE)*this,&someDWORD,sizeof(DWORD),&bytesRead,(LPOVERLAPPED)0);
|
|
return sizeof(DWORD)==bytesRead;
|
|
}
|
|
|
|
inline
|
|
WORD FileHandle::write(const BYTE &someByte)const
|
|
{
|
|
DWORD bytesWritten;
|
|
|
|
if(!isOkay())return FALSE;
|
|
::WriteFile((HANDLE)*this,&someByte,sizeof(BYTE),&bytesWritten,(LPOVERLAPPED)0);
|
|
return sizeof(BYTE)==bytesWritten;
|
|
}
|
|
|
|
inline
|
|
WORD FileHandle::write(const DWORD &someDWORD)const
|
|
{
|
|
DWORD bytesWritten;
|
|
|
|
if(!isOkay())return FALSE;
|
|
::WriteFile((HANDLE)*this,&someDWORD,sizeof(DWORD),&bytesWritten,(LPOVERLAPPED)0);
|
|
return sizeof(DWORD)==bytesWritten;
|
|
}
|
|
|
|
inline
|
|
WORD FileHandle::write(const WORD &someWORD)const
|
|
{
|
|
DWORD bytesWritten;
|
|
|
|
if(!isOkay())return FALSE;
|
|
::WriteFile((HANDLE)*this,&someWORD,sizeof(WORD),&bytesWritten,(LPOVERLAPPED)0);
|
|
return sizeof(WORD)==bytesWritten;
|
|
}
|
|
|
|
inline
|
|
WORD FileHandle::write(BYTE *lpBytePtr,DWORD dwExtent)const
|
|
{
|
|
DWORD bytesWritten;
|
|
|
|
if(!isOkay())return FALSE;
|
|
::WriteFile((HANDLE)*this,lpBytePtr,dwExtent,&bytesWritten,(LPOVERLAPPED)0);
|
|
return dwExtent==bytesWritten;
|
|
}
|
|
|
|
inline
|
|
DWORD FileHandle::write(const String &someString)const
|
|
{
|
|
WORD stringLength(someString.length());
|
|
DWORD bytesWritten;
|
|
|
|
if(!isOkay())return FALSE;
|
|
::WriteFile((HANDLE)*this,(char*)someString,stringLength,&bytesWritten,(LPOVERLAPPED)0);
|
|
return bytesWritten;
|
|
}
|
|
|
|
inline
|
|
DWORD FileHandle::writeLine(const String &someString)const
|
|
{
|
|
String lineString(someString);
|
|
WORD stringLength;
|
|
DWORD bytesWritten;
|
|
|
|
if(!isOkay())return FALSE;
|
|
lineString+=(BYTE)CarriageReturn;
|
|
lineString+=(BYTE)LineFeed;
|
|
stringLength=lineString.length();
|
|
::WriteFile((HANDLE)*this,(char*)lineString,stringLength,&bytesWritten,(LPOVERLAPPED)0);
|
|
return bytesWritten;
|
|
}
|
|
|
|
inline
|
|
WORD FileHandle::flush(void)const
|
|
{
|
|
if(!isOkay())return FALSE;
|
|
return ::FlushFileBuffers((HANDLE)*this);
|
|
}
|
|
|
|
inline
|
|
String FileHandle::pathFileName(void)const
|
|
{
|
|
return mPathFileName;
|
|
}
|
|
|
|
inline
|
|
void FileHandle::pathFileName(const String &pathFileName)
|
|
{
|
|
mPathFileName=pathFileName;
|
|
}
|
|
|
|
inline
|
|
FileHandle::Share FileHandle::share(void)const
|
|
{
|
|
return mShare;
|
|
}
|
|
|
|
inline
|
|
void FileHandle::share(Share share)
|
|
{
|
|
mShare=share;
|
|
}
|
|
|
|
inline
|
|
FileHandle::Access FileHandle::access(void)const
|
|
{
|
|
return mAccess;
|
|
}
|
|
|
|
inline
|
|
void FileHandle::access(Access access)
|
|
{
|
|
mAccess=access;
|
|
}
|
|
|
|
inline
|
|
void FileHandle::disposition(Disposition disposition)
|
|
{
|
|
mDisposition=disposition;
|
|
}
|
|
|
|
inline
|
|
FileHandle::Disposition FileHandle::disposition(void)const
|
|
{
|
|
return mDisposition;
|
|
}
|
|
|
|
inline
|
|
WORD FileHandle::isOkay(void)const
|
|
{
|
|
return (INVALID_HANDLE_VALUE==mhFileHandle?FALSE:TRUE);
|
|
}
|
|
|
|
inline
|
|
DWORD FileHandle::size(void)const
|
|
{
|
|
if(!isOkay())return FALSE;
|
|
return ::GetFileSize((HANDLE)*this,0);
|
|
}
|
|
|
|
inline
|
|
void FileHandle::close(void)
|
|
{
|
|
if(INVALID_HANDLE_VALUE==mhFileHandle)return;
|
|
if(CloseHandle==mDisposition)::CloseHandle(mhFileHandle);
|
|
mhFileHandle=INVALID_HANDLE_VALUE;
|
|
}
|
|
#endif
|
|
#endif |