// Iniファイル操作モジュール private { import win32.windows; import std.string, std.utf; } private const uint buffer_size = 1024 * 10; // 10KB Pre Buffer Size class IniFile { private: char[] filename; public: this(char[] filename) { this.filename = filename.dup; } // 数値を取得 int GetInteger(char[] section, char[] key, int default_value) { return GetPrivateProfileInt(toUTF16z(section), toUTF16z(key), default_value, toUTF16z(filename)); } // 文字列を取得 char[] GetString(char[] section, char[] key, char[] default_string) { wchar[] buffer = new wchar[buffer_size]; int len = GetPrivateProfileString(toUTF16z(section), toUTF16z(key), toUTF16z(default_string), buffer, buffer_size - 1, toUTF16z(filename)); if (len == 0) { return ""; } return toUTF8(buffer[0..len]); } // セクション名のリストを取得 char[][] GetSectionNames() { wchar[] buffer = new wchar[buffer_size]; char[][] result; int count = 0; int len = GetPrivateProfileSectionNames(buffer, buffer_size - 1, toUTF16z(filename)); char[][] pre_result = split(toUTF8(buffer[0..len]), "\0"); for (int i = 0; i < pre_result.length; i++) { if (pre_result[i].length != 0) { result.length = result.length + 1; result[count] = pre_result[i]; count++; } } return result; } // 数値の書き込み void WriteInteger(char[] section, char[] key, int value) { assert(WritePrivateProfileString(toUTF16z(section), toUTF16z(key), toUTF16z(std.string.toString(value)), toUTF16z(filename))); } // 文字列の書き込み void WriteString(char[] section, char[] key, char[] value) { assert(WritePrivateProfileString(toUTF16z(section), toUTF16z(key), toUTF16z(value), toUTF16z(filename))); } }