Artifact f917f310296a724b53b0501fb4c3e0e6a2079672
#ifndef _KILIB_FILE_H_
#define _KILIB_FILE_H_
#include "types.h"
#include "memory.h"
#ifndef __ccdoc__
namespace ki {
#endif
//=========================================================================
//@{ @pkg ki.StdLib //@}
//@{
//	簡易ファイル読込
//
//	ファイルマッピングを用いるので、扱いが簡単でわりと高速です。
//	ただし困ったことに、4GBまでしか開けません。
//@}
//=========================================================================
class FileR : public Object
{
public:
	FileR();
	~FileR();
	//@{
	//	開く
	//	@param fname ファイル名
	//	@return 開けたかどうか
	//@}
	bool Open( const TCHAR* fname );
	//@{
	//	閉じる
	//@}
	void Close();
public:
	//@{ ファイルサイズ //@}
	ulong size() const;
	//@{ ファイル内容をマップしたアドレス取得 //@}
	const uchar* base() const;
private:
	HANDLE      handle_;
	HANDLE      fmo_;
	ulong       size_;
	const void* basePtr_;
private:
	NOCOPY(FileR);
};
//-------------------------------------------------------------------------
inline ulong FileR::size() const
	{ return size_; }
inline const uchar* FileR::base() const
	{ return static_cast<const uchar*>(basePtr_); }
//=========================================================================
//@{
//	簡易ファイル書き込み
//
//	てきとーにバッファリングしつつ。
//@}
//=========================================================================
class FileW : public Object
{
public:
	FileW();
	~FileW();
	//@{ 開く //@}
	bool Open( const TCHAR* fname, bool creat=true );
	//@{ 閉じる //@}
	void Close();
	//@{ 書く //@}
	void Write( const void* buf, ulong siz );
	//@{ 一文字書く //@}
	void WriteC( uchar ch );
public:
	void Flush();
private:
	const int    BUFSIZE;
	HANDLE       handle_;
	uchar* const buf_;
	ulong        bPos_;
private:
	NOCOPY(FileW);
};
//=========================================================================
}      // namespace ki
#endif // _KILIB_FILE_H_