Тема: AHK: Ini file object
Создаёт массив из ини файла, и записывает этот массив обратно (перезапись файла целиком).
Зачем это может пригодится:
Файл сетевой, и каждое обращение к нему занимает время
Частое внесение настроек, и не хочется "дёргать" жёсткий диск
Требуется в какой-то момент решать - сохранять или не сохранять все новые настройки
Методы:
New(File, FileBackUp = "")
File - путь к ини файлу.
FileBackUp - путь к файлу, если указан и были внесены новые настройки, при вызове Save в этот файл будут скопированы прежние настройки.
Read(Section, Key, Default = "")
Section - секция.
Key - ключ.
Default - если ключа не существует, будет возвращено это значение, если не указано, то будет возвращено пустое значение.
Write(Section, Key, Value = "")
Без комментариев.
Delete(Section, Key)
Без комментариев.
DeleteSection(Section)
Удаляет секцию.
Save()
Перезаписывает файл целиком если были внесены новые настройки, то есть если вызывались методы Write, Delete или DeleteSection.
Важно:
Если хотите использовать уже существующий файл, надо преобразовать его в UTF-8 с BOM, иначе может испортить не ANSI символы.
Порядок секций и ключей в файле будет всегда в алфавитном порядке.
Комментарии не сохранятся.
Если файла не существует, метод Write не создаёт новый файл.
Тема для обсуждения.
Пример:
Ini := new IniFile(A_ScriptDir "\Settings.Ini")
MsgBox % Ini.Read("MySection1", "MyKey1", "Default")
Ini.Write("MySection1", "MyKey1", A_TickCount)
Ini.Save()
ExitApp
Class:
Class IniFile {
__New(File, FileBackUp = "") {
this.Path := File
this.FileBackUp := FileBackUp
oFile := FileOpen(this.Path, "r`n", "UTF-8")
Str := oFile.Read()
oFile.Close()
Pos := 1
While Pos := RegExMatch("`n" Str, "S)\n\s*\[(.*?)]\s*\n(.*?)(\n\s*\[.*?]\s*\n|$)", Match, Pos)
{
Pos += StrLen(Match) - StrLen(Match3)
this.Data[Section := Match1] := {}
Loop, Parse, Match2, `n, `r
{
RegExMatch(A_LoopField, "S)\s*(.*?)\s*=(.*)", V)
If !StrLen(V1)
Continue
this.Data[Section, V1] := V2
}
}
}
Read(Section, Key, Default = "") {
If (Default != "" && !this.Data[Section].HasKey(Key))
Return Default
Return this.Data[Section][Key]
}
Write(Section, Key, Value = "") {
If !IsObject(this.Data[Section])
this.Data[Section] := {}
this._CheckChanged()
Return this.Data[Section][Key] := Value
}
Delete(Section, Key) {
this._CheckChanged()
Return this.Data[Section].Delete(Key)
}
DeleteSection(Section) {
this._CheckChanged()
Return this.Data.Delete(Section)
}
_CheckChanged() {
If !this.changed
this.changed := 1
}
Save() {
If !this.changed
Return
For Section, Keys in this.Data
{
Str .= "[" Section "]`n"
For Key, Value in Keys
Str .= Key "=" Value "`n"
}
If this.FileBackUp
FileCopy, % this.Path, % this.FileBackUp, 1
oFile := FileOpen(this.Path, "w", "UTF-8")
oFile.Length := 0
oFile.Write(Str)
oFile.Close()
}
}
Win10x64 AhkSpy, Hotkey, ClockGui