涼の成長記録

自らの人生に主導権を持つべく、独立を目指して2014年3月31日を持ってITエンジニアを退職。そんな23歳♂の成長記録。

INIファイルアクセスクラス

一般レベルの品質の強固なプログラムを組むためには、どうしたら良いのでしょう。いつになれば、初心者を卒業できるのでしょう。そんなことを思いながら、コードをブログに載せまくって、誰かエンジニアとしてメンターになってくれる人が、現れないかを待ち続ける日々です。

TIniFileAccess.h

/*!
    @file   TIniFileAccess.h
    @brief  INIファイルアクセスクラス定義

    @author 涼
*/

#ifndef TIniFileAccessH
#define TIniFileAccessH

#include <IniFiles.hpp>

namespace Common {
namespace FileAccess {

/*!
    INIファイルアクセスクラス

    INIファイルアクセスを行うクラスのベースとしてヘルパーを担う。
    コンストラクターでファイルのパスを渡して、
    begin(), end()メソッドでファイルのオープン/クローズを行い、
    read(), write()メソッドで、指定のセクション、キーへアクセスする。
*/
class TIniFileAccess {
    public:
        /*!
            コンストラクター
        */
        __fastcall TIniFileAccess(const UnicodeString &filePath);

        /*!
            仮想デストラクター
        */
        virtual __fastcall ~TIniFileAccess();

        /**
         *  @brief  コンストラクターで渡されたファイルパスが存在すればtrueを返す。
         *
         *  @return ファイルがあればtrue。なければfalse。
         */
        bool __fastcall isFileExist();

        /*!
            INIファイル操作を開始する。

            @return なし。
        */
        void __fastcall begin();

        /*!
            INIファイル操作を終了する。

            @return なし。
        */
        void __fastcall end();

        /*!
            読み込み。

            @param  section     :セクション
            @param  key         :キー
            @param  readData    :読み込んだデータを格納する文字列のポインタ。
                                 読込みに失敗した場合は""を格納する。
            @return なし。
        */
        void __fastcall read(const UnicodeString &section, const UnicodeString &key, UnicodeString *readData);

        /*!
            文字列書き込み。

            @param  section :セクション
            @param  key     :キー
            @param  value   :書込む値
            @return なし。
        */
        void __fastcall write(const UnicodeString &section, const UnicodeString &key, const UnicodeString &value);

        /*!
            数値書き込み(オーバーロード)。

            @param  section :セクション
            @param  key     :キー
            @param  value   :書込む値
            @return なし。
        */
        void __fastcall write(const UnicodeString &section, const UnicodeString &key, int value);


    private:
        //! ファイル名称
        const UnicodeString m_FilePath;

        //! INIファイルの操作用
        TIniFile *m_IniFile;
};

}   // namespace FileAccess
}   // namespace Common

#endif

TIniFileAccess.cpp

/*!
    @file   TIniFileAccess.cpp
    @brief  INIファイルアクセスクラスの実装

    @author 涼
*/

#include <vcl.h>
#pragma hdrstop

#include <IOUtils.hpp>
#include "TIniFileAccess.h"

#pragma package(smart_init)

namespace Common {
namespace FileAccess {

//------------------------------------------------------------------------------
// コンストラクター
//------------------------------------------------------------------------------
__fastcall TIniFileAccess::TIniFileAccess(const UnicodeString &filePath) : m_FilePath(filePath) {
    m_IniFile = NULL;

    // フォルダーを作成しておく
    try {
        ForceDirectories(TPath::GetDirectoryName(m_FilePath));  // フォルダ作成
    }
    catch (...) {
        // 例外もぐもぐ。。
    }
}

//------------------------------------------------------------------------------
// m_FilePathにファイルがあればtrueを返す
//------------------------------------------------------------------------------
bool __fastcall TIniFileAccess::isFileExist() {
    return FileExists(m_FilePath);
}

//------------------------------------------------------------------------------
// TIniFileのインスタンス生成
//------------------------------------------------------------------------------
void __fastcall TIniFileAccess::begin() {
    m_IniFile = new TIniFile(m_FilePath);
}

//------------------------------------------------------------------------------
// TIniFileのインスタンス破棄
//------------------------------------------------------------------------------
void __fastcall TIniFileAccess::end() {
    delete m_IniFile;
}

//------------------------------------------------------------------------------
// 読込み
//------------------------------------------------------------------------------
void __fastcall TIniFileAccess::read(const UnicodeString &section, const UnicodeString &key, UnicodeString *readData) {
    if (m_IniFile == NULL) return;

    *readData = m_IniFile->ReadString(section, key, L"");
}

//------------------------------------------------------------------------------
// 文字列書込み
//------------------------------------------------------------------------------
void __fastcall TIniFileAccess::write(const UnicodeString &section, const UnicodeString &key, const UnicodeString &value) {
    if (m_IniFile == NULL) return;

    m_IniFile->WriteString(section, key, value);
}

//------------------------------------------------------------------------------
// 数値書込み
//------------------------------------------------------------------------------
void __fastcall TIniFileAccess::write(const UnicodeString &section, const UnicodeString &key, int value) {
    if (m_IniFile == NULL) return;

    m_IniFile->WriteInteger(section, key, value);
}

}   // namespace FileAccess
}   // namespace Common