#ifndef TFILE_H
#define TFILE_H
#include "tcommon.h"
#include <windows.h>
#include "tfilepath.h"
namespace TFileConsts
{
enum SeekMode {
seekStart = 0,
seekCur,
seekEnd
};
enum eFlags {
kRead = 0x00000001,
kWrite = 0x00000002,
kReadWrite = kRead | kWrite,
kDenyNone = 0x00000000,
kDenyRead = 0x00000010,
kDenyWrite = 0x00000020,
kDenyAll = kDenyRead | kDenyWrite,
kOpenExisting = 0x00000100,
kOpenAlways = 0x00000200,
kCreateAlways = 0x00000300,
kCreateNew = 0x00000400,
kTruncateExisting = 0x00000500, // not particularly useful, really
kCreationMask = 0x0000FF00,
kSequential = 0x00010000,
kRandomAccess = 0x00020000,
kUnbuffered = 0x00040000, // much faster on Win32 thanks to the crappy cache, but possibly bad in Unix?
kWriteThrough = 0x00080000,
kAllFileFlags = 0xFFFFFFFF
};
};
typedef __int32 uint32;
class TFile
{
HANDLE m_hFile;
TINT64 m_FilePosition;
public:
TFile() {}
TFile(const TFilePath &fname, uint32 flags = TFileConsts::kRead | TFileConsts::kDenyWrite | TFileConsts::kOpenExisting);
//TFile(const wchar_t *pwszFileName, uint32 flags = TFileConsts::kRead | TFileConsts::kDenyWrite | TFileConsts::kOpenExisting);
//TFile(VDFileHandle h);
~TFile();
bool open(const TFilePath &fname, uint32 flags = TFileConsts::kRead | TFileConsts::kDenyWrite | TFileConsts::kOpenExisting); // false if failed due to not found or already exists
//bool open(const wchar_t *pwszFileName, uint32 flags = TFileConsts::kRead | TFileConsts::kDenyWrite | TFileConsts::kOpenExisting); // false if failed due to not found or already exists
bool close();
bool truncate();
TINT64 size();
TINT32 read(void *buffer, TINT32 length);
TINT32 write(const void *buffer, TINT32 length);
bool seek(TINT64 newPos, TFileConsts::SeekMode mode = TFileConsts::seekStart);
bool skip(TINT64 delta);
TINT64 tell();
bool isOpen();
string getLastError();
protected:
bool open_internal(const TFilePath &fname, /* const wchar_t *pwszFilename, */ uint32 flags);
private:
TFile(const TFile &);
const TFile &operator=(const TFile &f);
DWORD m_ec;
};
#endif