Windowsコード集 上のページ

#0017 簡易ファイル操作クラス

個人的に気に入っているクラスです。
Win32で推奨しているCreateFileを、できるだけ簡単に使用するための物です。

//----------------------------------------------------------------------------
// cfile.h
//----------------------------------------------------------------------------

typedef enum{CA_CREATE,CA_ACCESS}CFILE_ATTRIBUTE;

class CFile{
protected:
    HANDLE m_handle;
public:
    CFile(LPSTR filename,CFILE_ATTRIBUTE attr = CA_ACCESS){
        m_handle = NULL;
        Open(filename,attr);}
    CFile(){m_handle = NULL;}
    ~CFile(){Close();}
    BOOL Open(LPSTR filename,CFILE_ATTRIBUTE attr = CA_ACCESS);
    BOOL Open(){return m_handle != NULL;}
    BOOL Create(LPSTR filename){return Open(filename,CA_CREATE);}
    void Close();
    DWORD GetSize(){return GetFileSize(m_handle,NULL);}
    BOOL Seek(LONG offset,DWORD seek = FILE_BEGIN){
            return (SetFilePointer(m_handle,offset,NULL,seek) != 0xFFFFFFFF);}
    BOOL Begin(){return (SetFilePointer(m_handle,0,NULL,FILE_BEGIN) != 0xFFFFFFFF);}
    BOOL Bottom(){return (SetFilePointer(m_handle,0,NULL,FILE_END) != 0xFFFFFFFF);}
    DWORD GetSeek(){return SetFilePointer(m_handle,0,NULL,FILE_CURRENT);}
    DWORD Read(LPVOID buf,DWORD size);
    DWORD Write(LPVOID buf,DWORD size);
};


//----------------------------------------------------------------------------
// cfile.cpp
//----------------------------------------------------------------------------

BOOL CFile::Open(LPSTR filename,CFILE_ATTRIBUTE attr)
{
    if(m_handle != NULL)Close();
    DWORD a = ((attr == CA_CREATE) ? CREATE_NEW : 0) | ((attr == CA_ACCESS) ? OPEN_EXISTING : 0);
    m_handle = CreateFile(filename,GENERIC_READ|GENERIC_WRITE,
                          FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,a,
                          FILE_ATTRIBUTE_NORMAL,NULL);
    if(m_handle == INVALID_HANDLE_VALUE){
        m_handle = NULL;
        return FALSE;
    }
    return TRUE;
}

void CFile::Close()
{
    if(m_handle != NULL)CloseHandle(m_handle);
    m_handle = NULL;
}

DWORD CFile::Read(LPVOID buf,DWORD size)
{
    DWORD retsize = 0;
    if(ReadFile(m_handle,buf,size,&retsize,NULL)){
        return retsize;
    }
    return 0;
}

DWORD CFile::Write(LPVOID buf,DWORD size)
{
    DWORD retsize = 0;
    if(WriteFile(m_handle,buf,size,&retsize,NULL)){
        return retsize;
    }
    return 0;
}


//
// 簡単なファイルアクセス(全部読む)
//
LPBYTE buf;     // 格納先
CFile f;
if(f.Open("input.dat",CA_ACCESS)){  // 通常アクセスでオープン
    buf = (LPBYTE)malloc(f.GetSize());
    f.Read(buf,f.GetSize());
    f.Close();
}


//
// 簡単なファイルアクセス2(出力)
//
LPBYTE buf;     // 保存元
DWORD size;     // bufのサイズ
CFile f;
if(f.Open("input.dat",CA_CREATE)){  // 新規ファイルでオープン
    f.Write(buf,size);
    f.Close();
}




上のページ