1 (изменено: serzh82saratov, 2019-08-06 18:48:09)

Тема: 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 символы.
Порядок секций и ключей в файле будет всегда в алфавитном порядке.
Комментарии не сохранятся.


Тема для обсуждения.

Пример:

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()
	}
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui