Gibt es bei der o.g. Funktion eine Begrenzung der Anzahl gefundener Sektionen
IniReadSectionNames Grenze
-
Superdau -
19. November 2019 um 14:15 -
Erledigt
-
-
- Offizieller Beitrag
Willst du nur eine bestimmte Anzahl lesen?
Oder
Willst du wissen ob es eine Obergrenze an Sektionen gibt?
-
Ich glaub du versuchst am falschen Ast zu sägen, was willst du denn genau realisieren, dass du so eine Funktion brauchst bzw. diese Frage stellst?
-
Gibt es bei der o.g. Funktion eine Begrenzung der Anzahl gefundener Sektionen
Falls sich daran nichts geändert hat, dann gelten seitens AutoIt folgende Begrenzungen :
-> die maximal unterstützte Größe der gesamten INI-Datei beträgt 64 KB.
-> die maximal unterstützte Größe einer INI-Sektion beträgt 32 KB.
==> Daten außerhalb dieser Grenzen werden nicht gelesen
Siehe z.B. auch -> Bemerkung in der Hilfe zu IniReadSection
-> Nur die ersten 32767 Zeichen werden aufgrund der Kompatibilität in einer Sektion gelesen.
Es kommt also nicht darauf an wieviele Sektionsnamen Du verwendest, sondern ob diese Begrenzungen eingehalten werden (hier also 64 KB).
Ansonsten sehe ich es so wie von alpines geschrieben : "... Was willst Du realisieren ?"
EDIT : Es gibt auch UDF's / alternative Verfahren um das Handling von INI.Dateien selbst zu gestalten.
EDIT 2 : google mal nach "autoit scripting dictionary"
Gruß Musashi
-
-
Vielen Dank Jungs,
Ich glaube, das erklärt meinen Bug.
Meine Ini ist 151kb groß, funktioniert aber noch.
Doch mit ein paar Daten mehr ists vorbei. Dann werden die Letzten nicht mehr gelesen.
Jetzt darf ich mir was zur Datenreduzierung ausdenken müssen, oder ein anderes Konzept verwenden.
-
Oder du splittest die Ini auf mehrere auf.
-
Das würde mein Script aber ganz schön verkomplizieren
-
Das würde mein Script aber ganz schön verkomplizieren
Zurück zur Kernfrage : "Warum benötigst Du eine so große .ini-Datei. Was wird dort gespeichert" ?
Benutzt Du die .ini quasi als Minidatenbank ?Gruß Musashi
-
- Offizieller Beitrag
Dafür verwende ich normale Textdateien als Config-Dateien (*.cfg).
Struktur je Zeile:
sektion;Schlüssel=Wert;Schlüssel=Wert;Schlüssel=Wert;Schlüssel=Wert
Ist easy mit FileReadLine, FileWriteLine, StringSplit zu handeln.
-
Wieso würde das deine Ini groß kompliziert machen?
Du müsstest nur einige Sektionen in einer separaten Ini speichern.
Dann ist es vllt. zwar nicht mehr nur eine settings.ini (oder wie auch immer sie bei dir heisst), sondern:
- Backup-Settings.ini
- User-Setting.ini
- ...
Und das könntest du dir durchaus durch Logik zusammen bauen und ist sogar bei der manuellen Betrachtung der Ini zumeist Übersichtlicher.
-
Dafür verwende ich normale Textdateien als Config-Dateien (*.cfg).
Struktur je Zeile:
sektion;Schlüssel=Wert;Schlüssel=Wert;Schlüssel=Wert;Schlüssel=Wert
Ist easy mit FileReadLine, FileWriteLine, StringSplit zu handeln.
An diese Möglichkeit hab ich auch schon gedacht.
Ist halt nur n großer Umbau
Spoiler anzeigen
C
Alles anzeigen#cs ---------------------------------------------------------------------------- AutoIt Version: 3.3.6.1 Script Version: 2.2.2 Author: XXXX Script Function: Script verwaltet NC-Daten Änderungen: Baugruppen wurden entfernt. verschiedene Konfigurationsdateien wurde eingebunden. Verwendung eines gesonderten Arbeitsverzeichnisses möglich Tnc-Remo wird über eine extra Konfigurations-Datei gesteuert. Freigabe wurde eingebunden Shellexecute wird über die Prozess-ID wieder geschlossen. Globaler Programmstop über Konfigdatei eingebracht. automatisches Ausführen eines Updates möglich. Für Tebis wird der unc-Pfad in einen Laufwerksbuchstaben übersetzt. Unterstütz Bauteilefreigabe für meherere Projekte User-Stati und Adminfunktionen eingebracht (1 normaler User, 7 Poweruser, 77 Admin) Letzte Freigabeprojektnummer wird unter eigene Dokumente gespeichert und vorgeschlagen. 0-Bug entfert. Leere Datenbank führt nicht mehr zum Absturz Datenbanksicherung eingebaut. Fensterpositionen werden in der Userconf gespeichert. Status 25% und 75% eingebracht Traymenü eingebaut. NCDM unterstützt jetzt DragnDrop Breite auf 1010 geändert Ablauf beschleunigt (zB. wird "Projekt" nicht mehr extra in die Freigabe geschrieben) Geschwindigkeit beim Aktualisieren wird mitgelogt (userconf). Bei der Freigabe wird nun im Hauptfenster der Projektfilter auf das Freigabeproj. gesetzt. Positionsfehler beim Schließen in der Taskleiste behoben Bei Freigabe wird nun eine Liste der letzten 10 Projekte zur Auswahl angeboten. Zusätzliche Bauteile können angegeben werden. CAD-Datei kann verknüpft werden. Beim Aufruf der Benutzerkonfig wird jetzt das Hauptprogramm beendet. #ce ---------------------------------------------------------------------------- #include <GUIListBox.au3> #include <GuiConstantsEx.au3> #include <array.au3> #Include <File.au3> #Include <Date.au3> #include <EditConstants.au3> #Include <GuiListView.au3> #include <WindowsConstants.au3> #include <StaticConstants.au3> #include <WinAPI.au3> Global $version="NC-Daten-Manager 2018 (c) XXXX" global $conf=@ScriptDir&"\ncdm.conf" if not FileExists($conf) Then IniWrite($conf,"main","workdir",@ScriptDir&"\Workdir") IniWrite($conf,"main","status","1") IniWrite($conf,"main","wartung","Der NC-Daten-Manager ist wegen Wartungsarbeiten kurzzeitig nicht verfügbar.") IniWrite($conf,"main","DB-Sicherung",@ScriptDir&"\Workdir\") IniWrite($conf,"extra","pfad","0") IniWrite($conf,"extra","status","0") IniWrite($conf,"Tebiskonvert","\\ffnas01\tebis","T:") IniWrite($conf,@username,"status","7") EndIf global $userstatus=IniRead($conf,@UserName,"status","1") global $workdir=IniRead($conf,"main","workdir",@scriptdir) global $db=$workdir&"\ncdm.db" global $log=$workdir&"\ncdm.log" global $tempdir=$workdir&"\nc_temp" global $userconf=@MyDocumentsDir&"\ncdmuser.txt" Global $dbsicherung=IniRead($conf,"main","db-sicherung",@ScriptDir&"\Workdir\")&"ncdm_"&@YEAR&"-"&@MON&"-"&@MDAY&".db" Global $pro="*" if not FileExists($tempdir) then DirCreate($tempdir) FileCopy($db,$dbsicherung,8) if not FileExists($db) then If Not _FileCreate($db) Then MsgBox($MB_SYSTEMMODAL, "Error",$db&" konnte nicht erstellt werden.") _exit("Datenbankfehler") EndIf EndIf _wartung() if $cmdline[0]>0 then _freigabe ($cmdline) If WinExists($version) Then WinActivate($version) Exit EndIf global $remoconf=$workdir&"\tncremo.txt" if not FileExists($remoconf) Then IniWrite($remoconf,@ComputerName,"Pfad","C:\Program Files (x86)\HEIDENHAIN\TNCremo\TNCremo.exe") EndIf _FileWriteLog($log,"ncdm gestartet "&@ComputerName&"/"&@username,1) _wartung () _extra () ;~ erstellen des Traymenüs ------------------------------------------- $remobtn=TrayCreateItem("TNC-Remo-Pfad-ändern") $userconfbtn=TrayCreateItem("Benutzerkonfiguration") TrayCreateItem("") $confbtn=TrayCreateItem("Hauptkonfiguration") $dbbtn=TrayCreateItem("Datenbank") $logbtn=TrayCreateItem("Verlauf") TrayCreateItem("") $exit = TrayCreateItem("Exit") if $userstatus<77 then TrayItemSetState($confbtn, 128) TrayItemSetState($dbbtn, 128) TrayItemSetState($logbtn, 128) endif Opt("TrayMenuMode",1) ;~ erstellen der Gui ---------------------------------------------------------------- $xpos=iniread($userconf,$version,"xpos",100) $ypos=iniread($userconf,$version,"ypos",100) $main=GUICreate($version,1010,600,$xpos,$ypos, -1, $WS_EX_ACCEPTFILES ) GUISetStyle(BitOR($WS_MAXIMIZEBOX,$WS_MINIMIZEBOX,$WS_SIZEBOX,$WS_THICKFRAME,$WS_SYSMENU,$WS_CAPTION,$WS_OVERLAPPEDWINDOW,$WS_TILEDWINDOW,$WS_POPUP,$WS_POPUPWINDOW,$WS_GROUP,$WS_TABSTOP,$WS_BORDER,$WS_CLIPSIBLINGS)) GUICtrlCreateLabel("Projekt",250,10,100,20) GUICtrlCreateLabel("Zeichnungsnummer/Maschine",10,10,200,20) GUICtrlCreateLabel("Objekte:",850,10,100,20) GUICtrlCreateLabel("(Stunden:)",850,35,100,20) global $zeichnung_input=GUICtrlCreateInput("*",10,35,200,20) global $Projekt_input=GUICtrlCreateInput($pro,250,35,200,20) global $laufzeit_input=GUICtrlCreateInput("0",940,35,50,20,$ES_READONLY) global $objekt_input=GUICtrlCreateInput("0",940,10,50,20,$ES_READONLY) $akt=GUICtrlCreateButton("aktualisieren",580,35,150,20) $ausbl=GUICtrlCreateCheckbox(" fertige ausblenden",580,10,120,20) GUICtrlSetState($ausbl,$GUI_CHECKED ) GUICtrlSetState(-1, 1) $listview = GUICtrlCreateListView("", 10, 70, 980, 515) _GUICtrlListView_AddColumn($ListView, "Dokumentationen", 350) _GUICtrlListView_AddColumn($ListView, "Status", 60) _GUICtrlListView_AddColumn($ListView, "Fertigsteller", 100) _GUICtrlListView_AddColumn($ListView, "Projekt", 100) _GUICtrlListView_AddColumn($ListView, "Anzahl", 50) _GUICtrlListView_AddColumn($ListView, "Minuten", 60) _GUICtrlListView_AddColumn($ListView, "Freigegeben", 120) _GUICtrlListView_AddColumn($ListView, "Bereitsteller", 90) _GUICtrlListView_RegisterSortCallBack($ListView) _bereinigung() $Context = GUICtrlCreateContextMenu($listview) $docopen = GUICtrlCreateMenuItem("Dokumentation öffnen", $Context) $progsend = GUICtrlCreateMenuItem("Programme übertragen", $Context) GUICtrlCreateMenuItem("", $Context) $status = GUICtrlCreateMenu("Fertigungsstatus", $Context) $0p = GUICtrlCreateMenuItem("0%", $status) $10p = GUICtrlCreateMenuItem("10%", $status) $20p = GUICtrlCreateMenuItem("20%", $status) $25p = GUICtrlCreateMenuItem("25%", $status) $30p = GUICtrlCreateMenuItem("30%", $status) $40p = GUICtrlCreateMenuItem("40%", $status) $50p = GUICtrlCreateMenuItem("50%", $status) $60p = GUICtrlCreateMenuItem("60%", $status) $70p = GUICtrlCreateMenuItem("70%", $status) $75p = GUICtrlCreateMenuItem("75%", $status) $80p = GUICtrlCreateMenuItem("80%", $status) $90p = GUICtrlCreateMenuItem("90%", $status) $100p = GUICtrlCreateMenuItem("100% (fertig)", $status) GUICtrlCreateMenuItem("", $Context) $fdir = GUICtrlCreateMenuItem("Verzeichnis öffnen", $Context) $fcad = GUICtrlCreateMenuItem("CAD öffnen", $Context) GUICtrlCreateMenuItem("", $Context) $fchange = GUICtrlCreateMenuItem("Freigabe ändern", $Context) $fdelete = GUICtrlCreateMenuItem("Freigabe löschen", $Context) if $userstatus<2 then GUICtrlSetState($fdir,128) EndIf if $userstatus<7 then GUICtrlSetState($fchange,128) GUICtrlSetState($fdelete,128) EndIf GUICtrlSetData($projekt_input,$pro) GUICtrlSetState($listview, $GUI_DROPACCEPTED) GUISetState(@SW_SHOW) _list() ;~ -------------------------------------------------------------------------------------- HotKeySet("^!d","_delete") HotKeySet("^!a","_aenderung") $stat_chkbox=GUICtrlRead($ausbl) Global $starttime = TimerInit() Local $projekt, $zeichnung while 1 ;~ Hauptschleife if $Projekt <> GUICtrlRead($Projekt_input) then _list() if $zeichnung <> GUICtrlRead($zeichnung_input) then _list() $msg = GUIGetMsg() Select Case $msg = $GUI_EVENT_CLOSE _possave($main,$version) _exit ("Standard-Exit") Case $msg = $GUI_EVENT_DROPPED if @GUI_DropId = $listview Then _freigabe(@GUI_DragFile) _list() Case $msg = $docopen _open() Case $msg = $progsend _programme() Case $msg = $akt $tt=TimerInit() _list () IniWrite($userconf,@username,"Prozessdauer",TimerDiff($tt)) Case $msg=$listview _list () _GUICtrlListView_SortItems($ListView, GUICtrlGetState($ListView)) Case $msg = $fdir _open_ex () Case $msg = $fcad _opencad () Case $msg = $fchange _aenderung () Case $msg = $fdelete _delete() Case $msg = $0p _erledigt (0) Case $msg = $10p _erledigt (10) Case $msg = $20p _erledigt (20) Case $msg = $25p _erledigt (25) Case $msg = $30p _erledigt (30) Case $msg = $40p _erledigt (40) Case $msg = $50p _erledigt (50) Case $msg = $60p _erledigt (60) Case $msg = $70p _erledigt (70) Case $msg = $75p _erledigt (75) Case $msg = $80p _erledigt (80) Case $msg = $90p _erledigt (90) Case $msg = $100p _erledigt (100) EndSelect $msg = TrayGetMsg () Select Case $msg = $remobtn _remo () Case $msg = $confbtn ShellExecute($conf) Case $msg = $logbtn ShellExecute($log) Case $msg = $dbbtn ShellExecute($db) Case $msg = $userconfbtn ShellExecute($userconf) _exit ("Benutzerkonfig geöffnet") Case $msg = $exit _exit ("Tray-Exit") EndSelect if TimerDiff($starttime) >10000 Then _wartung () _extra () Global $starttime = TimerInit() EndIf if GUICtrlRead($ausbl)<>$stat_chkbox Then _list () $stat_chkbox=GUICtrlRead($ausbl) EndIf sleep(2) WEnd _GUICtrlListView_UnRegisterSortCallBack($ListView) _exit ("Standard-Exit") ;~ Funktionen -------------------------------------------------------------------------------------------------- func _list() ; Funktion listet die relevanten Daten _GUICtrlListView_DeleteAllItems($listview) $sektionen=IniReadSectionNames($db) if @error>0 then return Global $Projekt=GUICtrlRead($Projekt_input) global $zeichnung=GUICtrlRead($zeichnung_input) Local $bauteile[1] $gesamtzeit=0 $gesamtzahl=0 $fact=1 for $x=1 to $sektionen[0] $fname=StringSplit($sektionen[$x],"___projekt_",1) $dbz=$fname[1] $dbp=$fname[2] $fertig=IniRead($db,$sektionen[$x],"status","0") $dbx=IniRead($db,$sektionen[$x],"extra","") if StringInStr($dbp&"*",$projekt) and StringInStr($dbz&$dbx&"*",$zeichnung) Then if $fertig<100 or GUICtrlRead($ausbl)=4 then $rx=1-$fertig/100 $stueckzahl=IniRead($db,$sektionen[$x],"stueckzahl","1") $gesamtzeit+=IniRead($db,$sektionen[$x],"laufzeit","")*$stueckzahl*$rx $gesamtzahl+=1 $fertigmelder=IniRead($db,$sektionen[$x],"fertigsteller","") $dateiname=$fname[1] GUICtrlCreateListViewItem($dateiname&"|"&$fertig&"%|"&$fertigmelder&"|"&$dbp&"|"&$stueckzahl&"|"&round(IniRead($db,$sektionen[$x],"laufzeit",""))&"|"&IniRead($db,$sektionen[$x],"freigabedatum","")&"|"&IniRead($db,$sektionen[$x],"freigegeben_von",""),$listview ) endif EndIf next GUICtrlSetData($objekt_input,$gesamtzahl) GUICtrlSetData($laufzeit_input,round($gesamtzeit/60)) EndFunc func _open() ; öffnet das markierte Dokument $fname=GUICtrlRead(GUICtrlRead($listview)) if not $fname then Return $fname=StringSplit($fname,"|",1) $freigabe=$fname[1]&"___projekt_"&$fname[4] $quellpfad=IniRead($db,$freigabe,"Quellpfad","gaudi") $datei=$quellpfad&$fname[1] global $kopie=$tempdir&"\"&$fname[1] $blocker=IniRead($db,$freigabe,"blockiert","anderem Nutzer") $f=0 if FileExists($datei) then if not FileExists($kopie) then FileCopy($datei,$kopie) if FileGetTime($datei,0,1)>FileGetTime($kopie,0,1) Then $f=1 if FileGetTime($datei,1,1)>FileGetTime($kopie,0,1) Then $f=1 if FileGetTime($datei,1,1)>FileGetTime($kopie,1,1) Then $f=1 if $f=1 Then if FileCopy($datei,$kopie,1)<1 Then MsgBox(16,$version&" Fehler!","Datei wird von "&$blocker&" blockiert") else MsgBox(64,$version&" Wichtig!","Dokumentation wurde aktualisiert. Programme müssen neu eingespielt werden!!!") IniWrite($db,$freigabe,"blockiert",@username) ShellExecute($kopie) _programme () endif else IniWrite($db,$freigabe,"blockiert",@username) ShellExecute($kopie) endif else MsgBox(48,$version,"Verknüpfung zu "&$datei&" ist nicht vorhanden.",5) EndIf EndFunc func _opencad() ; öffnet die entsprechende CAD-Datei $fname=GUICtrlRead(GUICtrlRead($listview)) if not $fname then Return $fname=StringSplit($fname,"|",1) $freigabe=$fname[1]&"___projekt_"&$fname[4] $datei=IniRead($db,$freigabe,"cad","") if FileExists($datei) then dim $alias $alias=IniReadSection($conf,"tebiskonvert") for $x=1 to $alias[0][0] $datei=StringReplace($datei,$alias[$x][0],$alias[$x][1]) next ShellExecute($datei) else MsgBox(16,$version&" Fehler!","keine Datei verknüpft") EndIf EndFunc Func _programme () ; ermögllicht das Kopieren der NC-Programme $fname=GUICtrlRead(GUICtrlRead($listview)) if not $fname then Return $fname=StringSplit($fname,"|",1) $freigabe=$fname[1]&"___projekt_"&$fname[4] $quellpfad=IniRead($db,$freigabe,"Quellpfad","") if $quellpfad="" then MsgBox(16,$version&" Fehler!","Verknüpfung zu "&$fname[1]&" ist nicht vorhanden.",30) else $tncremo=iniread($remoconf,@computername,"pfad","") if FileExists($tncremo) then $befehl=$tncremo&" "&Chr(34)&"-W"&$quellpfad&Chr(34) run($befehl) Else MsgBox(16,$version&" Fehler!","TncRemo wurde nicht gefunden") FileOpenDialog("Programme",$quellpfad,"Programme (*.h;*.nc)",5) endif endif EndFunc Func _erledigt ($s) ; meldet Bearbeitungen fertig $fname=GUICtrlRead(GUICtrlRead($listview)) if not $fname then Return $fname=StringSplit($fname,"|",1) $freigabe=$fname[1]&"___projekt_"&$fname[4] IniWrite($db,$freigabe,"status",$s) if $s=100 then IniWrite($db,$freigabe,"fertig",@YEAR&"/"&@MON&"/"&@MDAY&" "&@HOUR&":"&@MIN&":"&@SEC) IniWrite($db,$freigabe,"fertigsteller",@username) Else IniWrite($db,$freigabe,"fertig","") IniWrite($db,$freigabe,"fertigsteller",@username) EndIf _FileWriteLog($log,$freigabe&" Status auf "&$s&"% gesetzt durch "&@ComputerName&"/"&@username,1) if FileExists(@ScriptDir&"\exceltab.exe") then run(@ScriptDir&"\exceltab.exe") _list () EndFunc func _bereinigung () ; bereinigt alte erledigte Freigaben $sektionen=IniReadSectionNames($db) if @error>0 then return for $x=1 to $sektionen[0] $diff=_DateDiff( 'w',IniRead($db,$sektionen[$x],"fertig","0"),_NowCalc()) $status=IniRead($db,$sektionen[$x],"status","0") if $diff>1 and $status=100 and IniRead($db,$sektionen[$x],"schreibschutz","0")=0 Then IniDelete($db,$sektionen[$x]) FileDelete($tempdir&"\"&$sektionen[$x]) ; ----------------------------- Optional _FileWriteLog($log,$sektionen[$x]&" gelöscht durch System",1) EndIf next EndFunc func _open_ex() ; öffnet das Arbeitsverzeichnis $fname=GUICtrlRead(GUICtrlRead($listview)) if not $fname then Return $fname=StringSplit($fname,"|",1) $freigabe=$fname[1]&"___projekt_"&$fname[4] $quellpfad=IniRead($db,$freigabe,"Quellpfad","") $datei=$quellpfad&$fname[1] if FileExists($quellpfad) then $alias=IniReadSection($conf,"tebiskonvert") for $x=1 to $alias[0][0] $quellpfad=StringReplace($quellpfad,$alias[$x][0],$alias[$x][1]) next Run("explorer "&$quellpfad) else MsgBox(16,$version&" Fehler!","Verknüpfung zu "&$datei&" ist nicht vorhanden.",5) EndIf EndFunc Func _delete () ; löscht Einträge $fname=GUICtrlRead(GUICtrlRead($listview)) if not $fname then Return if $userstatus<7 then Return $fname=StringSplit($fname,"|",1) $freigabe=$fname[1]&"___projekt_"&$fname[4] if MsgBox(36,@ScriptName,"Wollen sie den Eintrag "&$fname[1]&" wirklich entfernen?")=6 then inidelete($db,$freigabe) if IniRead($db,$freigabe,"projekt","err")<>"err" then MsgBox(16,"Fehler",$fname[1]&" konnte nicht gelöscht werden!",5) Return EndIf FileDelete($tempdir&"\"&$fname[1]) _FileWriteLog($log,$freigabe&" gelöscht durch "&@ComputerName&"/"&@username,1) if FileExists(@ScriptDir&"\exceltab.exe") then run(@ScriptDir&"\exceltab.exe") _list () EndIf EndFunc func _wartung () if IniRead($conf,"main","status","1")=0 Then $wartungstext=IniRead($conf,"main","wartung","0") if $wartungstext <>"" then MsgBox(16,$version,$wartungstext,3) Exit(0) EndIf EndFunc func _extra () if IniRead($conf,"extra","status","0")=1 Then $extra=IniRead($conf,"extra","pfad","0") if FileExists($extra) Then Local $sDrive = "", $sDir = "", $sFilename = "", $sExtension = "" Local $aPathSplit = _PathSplit($extra, $sDrive, $sDir, $sFilename, $sExtension) Global $extrapn=$sFilename&$sExtension if not ProcessExists($extrapn) then run($extra) endif EndIf EndIf EndFunc ;~ Func _open_userconf () ;~ ShellExecute($userconf) ;~ EndFunc Func _freigabe ($input) if $userstatus<7 then Return if not IsArray($input) then local $eingang[2]=["1",$input] Else $Eingang=$input endif ;~ _arraydisplay($eingang) for $x=1 to $eingang[0] Dim $upfad, $szDrive, $szDir, $szFName, $szExt, $string, $cadfiles $upfad=_PathSplit($eingang[$x], $szDrive, $szDir, $szFName, $szExt) $dateiname=$upfad[3]&$upfad[4] $stueck = 2 $laufzeit = 0 $projekt = "" $extra="" $cad="--- bitte auswählen ---" if DriveMapGet($upfad[1])="" then $quellpfad=$upfad[1]&$upfad[2] else $quellpfad=DriveMapGet($upfad[1])&$upfad[2] EndIf $status="Freigabe" ;~ MsgBox(0,"","dateiname= "&$dateiname&@crlf&"Projekt= "&$projekt&@crlf&"Stückzahl= "&$stueck&@crlf&"Laufzeit= "&$laufzeit&@crlf&"Pfad= "&$quellpfad) $cadfiles=_FileListToArray($quellpfad,"*.cad") if $cadfiles[0]=1 then $cad=$quellpfad&$cadfiles[1] _dbaenderung ($status,$dateiname,$quellpfad,$projekt,$stueck,$laufzeit,$extra,$cad) Next ControlSetText($version, "", "Edit2", $pro) ;~ if WinExists($version) then _list() EndFunc Func _aenderung () if $userstatus<7 then Return $fname=GUICtrlRead(GUICtrlRead($listview)) if not $fname then Return $fname=StringSplit($fname,"|",1) $freigabe=$fname[1]&"___projekt_"&$fname[4] $dateiname=$fname[1] $stueck = IniRead($db,$freigabe,"stueckzahl","0") $laufzeit = IniRead($db,$freigabe,"laufzeit","0") $projekt = $fname[4] $quellpfad=IniRead($db,$freigabe,"quellpfad","") $extra=IniRead($db,$freigabe,"extra","") $cad=IniRead($db,$freigabe,"cad","") ;~ MsgBox(0,"","dateiname= "&$dateiname&@crlf&"Projekt= "&$projekt&@crlf&"Stückzahl= "&$stueck&@crlf&"Laufzeit= "&$laufzeit&@crlf&"Pfad= "&$quellpfad) _dbaenderung("Aenderung",$dateiname,$quellpfad,$Projekt,$stueck,$laufzeit,$extra,$cad) _list () EndFunc Func _dbaenderung ($status,$dateiname,$quellpfad,$projekt,$stueck,$laufzeit,$extra,$cad) ;~ ConsoleWrite($status) $pid=ShellExecute($quellpfad&$dateiname) $xpos=iniread($userconf,$status,"xpos",@DesktopWidth/2-150) $ypos=iniread($userconf,$status,"ypos",@DesktopHeight/2-150) ;~ MsgBox(0,"","Status= "&$status&@crlf&"dateiname= "&$dateiname&@crlf&"Projekt= "&$projekt&@crlf&"Stückzahl= "&$stueck&@crlf&"Laufzeit= "&$laufzeit&@crlf&"Pfad= "&$quellpfad) $dialog = GUICreate($Status, 315, 230, $xpos,$ypos, -1, BitOR($WS_EX_TOPMOST,$WS_EX_WINDOWEDGE)) $lbl1 = GUICtrlCreateLabel($dateiname, 15, 15, 285, 20) $lbl2 = GUICtrlCreateLabel("Projektnummer", 15, 40, 100, 20) $lbl4 = GUICtrlCreateLabel("Stückzahl", 15, 90, 100, 20) $lbl5 = GUICtrlCreateLabel("Laufzeit in Minuten", 15, 65, 100, 20) $lbl6 = GUICtrlCreateLabel("Zus. Bauteile", 15, 115, 100, 20) global $i_laufzeit = GUICtrlCreateInput($laufzeit, 150,65, 150, 20, BitOR($ES_AUTOHSCROLL,$ES_NUMBER)) global $i_stueckzahl = GUICtrlCreateInput($stueck, 150, 90, 150, 20, BitOR($ES_AUTOHSCROLL,$ES_NUMBER)) global $i_cad = GUICtrlCreateInput($cad, 100, 140, 200, 20) global $i_pfad = GUICtrlCreateInput($quellpfad, 15, 175, 285, 20) global $i_extra = GUICtrlCreateInput($extra, 150, 115, 150, 20) global $i_projekt = GUICtrlCreateCombo("", 150, 40, 150, 20) $lprojekt=IniRead($userconf,@username,"projekt","") if StringInStr($lprojekt,$projekt) Then GUICtrlSetData($i_projekt, $lprojekt, $projekt) Else GUICtrlSetData($i_projekt, $projekt&"|"&$lprojekt, $projekt) EndIf $fileb = GUICtrlCreateButton("CAD-Auswahl", 15, 140, 80, 20, $WS_GROUP) $OK = GUICtrlCreateButton("bestätigen", 15, 205, 120, 20, $WS_GROUP) $Abbrechen = GUICtrlCreateButton("abbrechen", 180, 205, 120, 20, $WS_GROUP) GUISetState(@SW_SHOW) While 1 $Freigabe=$dateiname&"___projekt_"&GUICtrlRead($i_projekt) $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE ExitLoop Case $fileb ConsoleWrite("XXX"&@crlf) $cadfile=FileOpenDialog("CAD-File auswählen",$quellpfad,"CAD-files(*.cad)") GUICtrlSetData($i_cad,$cadfile,"") Case $OK if GUICtrlRead($i_projekt)="" Then MsgBox(16,@scriptname,"Projektnummer fehlt!",3) else $Freigabe=$dateiname&"___projekt_"&GUICtrlRead($i_projekt) $pro=GUICtrlRead($i_projekt) if IniRead($db,$Freigabe,"quellpfad","") <>"" then if MsgBox(36,@scriptname,$dateiname&" wurde bereits freigegeben!"&@CRLF& "Wollen sie die Freigabe aktualisieren?") <> 6 Then ExitLoop endif if $projekt<>GUICtrlRead($i_projekt) Then IniRenameSection($db,$dateiname&"___projekt_"&$projekt,$Freigabe) $aktionen=5 $err=IniWrite($db,$Freigabe,"laufzeit",GUICtrlRead($i_laufzeit)) $err+=IniWrite($db,$Freigabe,"stueckzahl",GUICtrlRead($i_stueckzahl)) $err+=IniWrite($db,$Freigabe,"Quellpfad",GUICtrlRead($i_pfad)) $err+=IniWrite($db,$Freigabe,"extra",GUICtrlRead($i_extra)) $err+=IniWrite($db,$Freigabe,"cad",GUICtrlRead($i_cad)) if $status="Freigabe" then $err+=IniWrite($db,$Freigabe,"freigabedatum",@YEAR&"-"&@MON&"-"&@MDAY&" "&@HOUR&":"&@MIN&":"&@SEC) $err+=IniWrite($db,$Freigabe,"freigegeben_von",@UserName) $err+=IniWrite($db,$Freigabe,"status","0") $aktionen=7 Global $pro=GUICtrlRead($i_projekt) EndIf ;~ MsgBox(16,@scriptname&" test","Ziel erreicht") if $err<$aktionen then MsgBox(16,@scriptname&" Fehler","kein Zugriff auf Datenbank!") ExitLoop EndIf if StringInStr($lprojekt,GUICtrlRead($i_projekt)) Then $lprojekt=StringReplace($lprojekt,"|"&GUICtrlRead($i_projekt),"") endif $lprojekt=StringLeft ($lprojekt, 130) IniWrite($userconf,@username,"projekt",GUICtrlRead($i_projekt)&"|"&$lprojekt) if $status="Freigabe" then _FileWriteLog($log,$freigabe&" Freigegeben durch "&@ComputerName&"/"&@username,1) Else _FileWriteLog($log,$freigabe&" Freigabe geändert durch "&@ComputerName&"/"&@username,1) EndIf ExitLoop Endif Case $Abbrechen ExitLoop EndSwitch WEnd ProcessClose($pid) _possave($dialog,$status) GUIDelete($dialog) EndFunc Func _remo () $pfad_alt=IniRead($remoconf,@computername,"pfad","") Local $pfad_neu = FileOpenDialog("NC-REMO-Exe auswählen", @ProgramFilesDir & "\", "Anwendung (*.exe)", $FD_FILEMUSTEXIST,"TNCremo") if @error=0 then IniWrite($remoconf,@computername,"pfad",$pfad_neu) _FileWriteLog($log,"TNC-Remo-Pfad auf "&$pfad_neu&" geändert durch "&@ComputerName&"/"&@username,1) EndIf EndFunc Func _exit ($fehler) _FileWriteLog($log,"ncdm beendet "&@ComputerName&"/"&@username&" "&$fehler,1) Exit(0) EndFunc Func _possave ($winh,$win) $tRET = _WinAPI_GetWindowPlacement($winh) IniWrite($userconf,$win,"xpos",DllStructGetData($tRET, "rcNormalPosition", 1)) IniWrite($userconf,$win,"ypos",DllStructGetData($tRET, "rcNormalPosition", 2)) EndFunc
-
Auf die Gefahr hin zu nerven : "Beschreibe BITTE mal genauer was Du speichern möchtest"
Ich denke, Du beißt Dich nur an dem .ini-Ansatz fest, weil Du mit den Zugriffsfunktionen klarkommst.
.ini-Dateien sind primär aber nicht dazu gemacht, als Datenbank zu fungieren.
Der Vorschlag von BugFix wäre eine Alternative (zudem eine gute).
Sooo groß wäre der Umbau nicht - außerdem gibt es sicher bereits fertige Beispiele.
Gruß Musashi
-
Derzeit sehen die Einträge folgendermaßen aus:
Code
Alles anzeigen[evo100_ff20186725_messerhalter_schritt_1.pdf___projekt_F27389042601] laufzeit=21 stueckzahl=1 Quellpfad=\\ffnas01.xxxxx.com\tebis\Bauteile\FF2018\FF20186725\ cad=\\ffnas01.xxxxx.com\tebis\Bauteile\FF2018\FF20186725\ff20186725_messerhalter.cad freigabedatum=2019-10-22 13:18:17 freigegeben_von=xxxx status=100 blockiert=xxxx fertig=2019/11/14 14:24:22 fertigsteller=xxxx extra=
Momentan befinden sich ungefähr 430 solche Einträge in der Datenbank(ini)
-
Naja, ganz ehrlich: Zumal es ja nicht weniger Einträge werden, würde ich dringend eine (richtige) Datenbank empfehlen.
Auf Dauer denke ich wirst du mit sowohl mit der ini (selbst wenn gesplittet), als auch der Txt auf Probleme stoßen.
Und das Ding DANN doch noch in eine Datenbank umzumodeln wird ungleich aufwändiger.
Noch ein Tipp zur Datenreduktion:
Sollte (wie dein Beispiel aussieht) immer, cad = Quellpfad + Dateiname sein, würde ich entweder bei cad wirklich nur den Dateinamen speichern oder ihn aus deiner Sektion ableiten. Das spart schonmal eine Menge Zeichen/Daten.
-
Naja, ganz ehrlich: Zumal es ja nicht weniger Einträge werden, würde ich dringend eine (richtige) Datenbank empfehlen.
Es gibt sicher noch andere Wege, aber auch ich würde zu einer Datenbanklösung raten.
SQLite wird seitens AutoIt und anderen Programmen hervorragend unterstützt .
(zudem gibt es externe SQLite-Manager)
Es erfordert zu Beginn zwar etwas Einarbeitungszeit, aber mittelfristig wirst Du davon, auch bei anderen Projekten, profitieren.
Gruß Musashi
-
- Offizieller Beitrag
Ich habe mal auf die Schnelle das von mir angesprochene cfg-Modell in eine UDF gegossen:
config.au3
AutoIt
Alles anzeigen;-- TIME_STAMP 2019-11-20 14:49:31 v 0.1 #include-once #include <File.au3> Opt('MustDeclareVars', 1) #cs Struktur Config-Datei (*.cfg) == Sektion mit Inhalt == SECTION;Key=Value;Key=;Key=Value;Key=Value... Schlüssel ohne Wert MÜSSEN mit einem "=" abgeschlossen werden! == leere Sektion == SECTION Kommentarzeilen beginnen mit "#" Funktionen: _CfgRead() _CfgWrite() _CfgKeyDelete() _CfgSectionDelete() _CfgKeyList() _CfgSectionList() #ce ; #FUNCTION# ==================================================================================================================== ; Name ..........: _CfgRead ; Description ...: Reads the value of a key in a section. ; Syntax ........: _CfgRead($_sCfg, $_sSection, $_sKey[, $_sDefault = '']) ; Parameters ....: $_sCfg - Path of the config file ; $_sSection - Section with the searched key ; $_sKey - The searched key ; $_sDefault - [optional] The default return value. Default is ''. ; Return values .: Success The value of the passed key or if not set, the default value ; Failure The default value, set @error 1 - config file does'nt exist ; The default value, set @error 2 - config file is empty ; The default value, set @error 3 - none key-value-pairs in this section ; The default value, set @error 4 - key does'nt exist in this section ; The default value, set @error 5 - section does'nt exist ; Author ........: BugFix ; =============================================================================================================================== Func _CfgRead($_sCfg, $_sSection, $_sKey, $_sDefault='') If Not FileExists($_sCfg) Then Return SetError(1,0,$_sDefault) Local $aCfg = FileReadToArray($_sCfg), $aSectionLine, $aKeyVal, $iErr If @error = 2 Then Return SetError(2,0,$_sDefault) ; empty file For $i = 0 To UBound($aCfg) -1 If StringLeft($aCfg[$i], 1) = '#' Then ContinueLoop ; its a comment line - skip $aSectionLine = StringSplit($aCfg[$i], ';', 2) ; $STR_NOCOUNT (2) $iErr = @error If $aSectionLine[0] = $_sSection Then If $iErr = 1 Then Return SetError(3,0,$_sDefault) ; none key-value-pairs in this line For $j = 1 To UBound($aSectionLine) -1 $aKeyVal = StringSplit($aSectionLine[$j], '=', 2) ; $STR_NOCOUNT (2) If $aKeyVal[0] = $_sKey Then If UBound($aKeyVal) = 2 Then Return $aKeyVal[1] Else Return $_sDefault EndIf EndIf Next Return SetError(4,0,$_sDefault) EndIf Next Return SetError(5,0,$_sDefault) EndFunc ; #FUNCTION# ==================================================================================================================== ; Name ..........: _CfgWrite ; Description ...: Writes the value of a key in a section. ; Syntax ........: _CfgWrite($_sCfg, $_sSection, $_sKey, $_sValue) ; Parameters ....: $_sCfg - Path of the config file ; $_sSection - The section ; $_sKey - The key ; $_sValue - The value to store ; Return values .: Success 1 ; Author ........: BugFix ; =============================================================================================================================== Func _CfgWrite($_sCfg, $_sSection, $_sKey, $_sValue) If Not FileExists($_sCfg) Then Return FileWrite($_sCfg, StringFormat('%s;%s=%s\n', $_sSection, $_sKey, $_sValue)) EndIf Local $aCfg = FileReadToArray($_sCfg), $aSectionLine, $aKeyVal, $fH, $sLine, $iErr, $bReplaced If @error = 2 Then ; empty file $fH = FileOpen($_sCfg, 2) ; $FO_OVERWRITE (2) FileWrite($fH, StringFormat('%s;%s=%s\n', $_sSection, $_sKey, $_sValue)) Return FileClose($fH) EndIf For $i = 0 To UBound($aCfg) -1 If StringLeft($aCfg[$i], 1) = '#' Then ContinueLoop ; its a comment line - skip $aSectionLine = StringSplit($aCfg[$i], ';', 2) ; $STR_NOCOUNT (2) $iErr = @error If $aSectionLine[0] = $_sSection Then If $iErr = 1 Then ; none key-value-pairs in this line Return _FileWriteToLine($_sCfg, $i+1, StringFormat('%s;%s=%s', $_sSection, $_sKey, $_sValue), True) EndIf $sLine = $aSectionLine[0] $bReplaced = False For $j = 1 To UBound($aSectionLine) -1 $aKeyVal = StringSplit($aSectionLine[$j], '=', 2) ; $STR_NOCOUNT (2) If $aKeyVal[0] = $_sKey Then $sLine &= StringFormat(';%s=%s', $aKeyVal[0], $_sValue) $bReplaced = True Else $sLine &= StringFormat(';%s=%s', $aKeyVal[0], $aKeyVal[1]) EndIf Next If Not $bReplaced Then $sLine &= StringFormat(';%s=%s', $_sKey, $_sValue) Return _FileWriteToLine($_sCfg, $i+1, $sLine, True) EndIf Next ; section not found $fH = FileOpen($_sCfg, 1) ; $FO_APPEND (1) FileWrite($fH, StringFormat('%s;%s=%s\n', $_sSection, $_sKey, $_sValue)) Return FileClose($fH) EndFunc ; #FUNCTION# ==================================================================================================================== ; Name ..........: _CfgKeyDelete ; Description ...: Deletes a key-value-pair in a section ; Syntax ........: _CfgKeyDelete($_sCfg, $_sSection, $_sKey) ; Parameters ....: $_sCfg - Path of the config file ; $_sSection - Section with the searched key ; $_sKey - The key to delete ; Return values .: Success 1 ; Failure 0, set @error 1 - config file does'nt exist ; 0, set @error 2 - config file is empty ; 0, set @error 3 - none key-value-pairs in this section ; 0, set @error 4 - section does'nt exist ; Author ........: BugFix ; =============================================================================================================================== Func _CfgKeyDelete($_sCfg, $_sSection, $_sKey) If Not FileExists($_sCfg) Then Return SetError(1,0,0) Local $aCfg = FileReadToArray($_sCfg), $aSectionLine, $aKeyVal, $fH, $sLine, $iErr If @error = 2 Then Return SetError(2,0,0) ; empty file For $i = 0 To UBound($aCfg) -1 If StringLeft($aCfg[$i], 1) = '#' Then ContinueLoop ; its a comment line - skip $aSectionLine = StringSplit($aCfg[$i], ';', 2) ; $STR_NOCOUNT (2) $iErr = @error If $aSectionLine[0] = $_sSection Then If $iErr = 1 Then Return SetError(3,0,0) ; none key-value-pairs in this line $sLine = $aSectionLine[0] For $j = 1 To UBound($aSectionLine) -1 $aKeyVal = StringSplit($aSectionLine[$j], '=', 2) ; $STR_NOCOUNT (2) If $aKeyVal[0] = $_sKey Then ; do nothing, will not write again Else $sLine &= StringFormat(';%s=%s', $aKeyVal[0], $aKeyVal[1]) EndIf Next Return _FileWriteToLine($_sCfg, $i+1, $sLine, True) EndIf Next ; section not found Return SetError(4,0,0) EndFunc ; #FUNCTION# ==================================================================================================================== ; Name ..........: _CfgSectionDelete ; Description ...: Deletes a section ; Syntax ........: _CfgSectionDelete($_sCfg, $_sSection) ; Parameters ....: $_sCfg - Path of the config file ; $_sSection - The Section to delete ; Return values .: Success 1 ; Failure 0, set @error 1 - config file does'nt exist ; 0, set @error 2 - config file is empty ; 0, set @error 3 - section does'nt exist ; Author ........: BugFix ; =============================================================================================================================== Func _CfgSectionDelete($_sCfg, $_sSection) If Not FileExists($_sCfg) Then Return SetError(1,0,0) Local $aCfg = FileReadToArray($_sCfg), $aSectionLine If @error = 2 Then Return SetError(2,0,0) ; empty file For $i = 0 To UBound($aCfg) -1 If StringLeft($aCfg[$i], 1) = '#' Then ContinueLoop ; its a comment line - skip $aSectionLine = StringSplit($aCfg[$i], ';', 2) ; $STR_NOCOUNT (2) If $aSectionLine[0] = $_sSection Then Return _FileWriteToLine($_sCfg, $i+1, '', True) EndIf Next ; section not found Return SetError(3,0,0) EndFunc ; #FUNCTION# ==================================================================================================================== ; Name ..........: _CfgSectionList ; Description ...: Returns a array or string of all section names ; Syntax ........: _CfgSectionList($_sCfg[, $_bRetArray=True]) ; Parameters ....: $_sCfg - Path of the config file ; $_bRetArray - [optional] Return as array or delimited string, Default is True - Array ; Return values .: Success Array with all section names, count of sections on index [0] ; Failure 0, set @error 1 - config file does'nt exist ; 0, set @error 2 - config file is empty ; Author ........: BugFix ; =============================================================================================================================== Func _CfgSectionList($_sCfg, $_bRetArray=True) If Not FileExists($_sCfg) Then Return SetError(1,0,0) Local $aCfg = FileReadToArray($_sCfg), $aSectionLine, $aKeyVal, $sRet = '' If @error = 2 Then Return SetError(2,0,0) ; empty file For $i = 0 To UBound($aCfg) -1 If StringLeft($aCfg[$i], 1) = '#' Then ContinueLoop ; its a comment line - skip $aSectionLine = StringSplit($aCfg[$i], ';', 2) ; $STR_NOCOUNT (2) $sRet &= $aSectionLine[0] & ';' Next $sRet = StringTrimRight($sRet, 1) Return ($_bRetArray ? StringSplit($sRet, ';') : $sRet) EndFunc ; #FUNCTION# ==================================================================================================================== ; Name ..........: _CfgKeyList ; Description ...: Returns a array or string of all key names in a section ; Syntax ........: _CfgKeyList($_sCfg, $_sSection[, $_bRetArray=True]) ; Parameters ....: $_sCfg - Path of the config file ; $_sSection - Section to get the keys from ; $_bRetArray - [optional] Return as array or delimited string, Default is True - Array ; Return values .: Success 1 ; Failure 0, set @error 1 - config file does'nt exist ; 0, set @error 2 - config file is empty ; 0, set @error 3 - none key-value-pairs in this section ; 0, set @error 4 - section does'nt exist ; Author ........: BugFix ; =============================================================================================================================== Func _CfgKeyList($_sCfg, $_sSection, $_bRetArray=True) If Not FileExists($_sCfg) Then Return SetError(1,0,0) Local $aCfg = FileReadToArray($_sCfg), $aSectionLine, $aKeyVal, $iErr, $sRet = '' If @error = 2 Then Return SetError(2,0,0) ; empty file For $i = 0 To UBound($aCfg) -1 If StringLeft($aCfg[$i], 1) = '#' Then ContinueLoop ; its a comment line - skip $aSectionLine = StringSplit($aCfg[$i], ';', 2) ; $STR_NOCOUNT (2) $iErr = @error If $aSectionLine[0] = $_sSection Then If $iErr = 1 Then Return SetError(3,0,0) ; none key-value-pairs in this line For $j = 1 To UBound($aSectionLine) -1 $aKeyVal = StringSplit($aSectionLine[$j], '=', 2) ; $STR_NOCOUNT (2) $sRet &= $aKeyVal[0] & ';' Next $sRet = StringTrimRight($sRet, 1) Return ($_bRetArray ? StringSplit($sRet, ';') : $sRet) EndIf Next ; section not found Return SetError(4,0,0) EndFunc
An diese Möglichkeit hab ich auch schon gedacht.
Ist halt nur n großer Umbau
Der Umbau ist ein simples Replace-Skript für deine INI, dass die Aufgabe in wenigen ms erledigt.
-
- Offizieller Beitrag
Ich habe mal noch eine weitere Funktion hinzugefügt: _CfgSectionGetArray() - liest alle Schlüssel-Wert-Paare einer Sektion in ein 2D-Array.
config.au3 v0.2
AutoIt
Alles anzeigen;-- TIME_STAMP 2019-11-20 20:58:33 v 0.2 #include-once #include <File.au3> Opt('MustDeclareVars', 1) #cs Struktur Config-Datei (*.cfg) == Sektion mit Inhalt == SECTION;Key=Value;Key=;Key=Value;Key=Value... Schlüssel ohne Wert MÜSSEN mit einem "=" abgeschlossen werden! == leere Sektion == SECTION Kommentarzeilen beginnen mit "#" Funktionen: _CfgRead() _CfgWrite() _CfgKeyDelete() _CfgSectionDelete() _CfgKeyList() _CfgSectionList() _CfgSectionGetArray() #ce ; #FUNCTION# ==================================================================================================================== ; Name ..........: _CfgRead ; Description ...: Reads the value of a key in a section. ; Syntax ........: _CfgRead($_sCfg, $_sSection, $_sKey[, $_sDefault = '']) ; Parameters ....: $_sCfg - Path of the config file ; $_sSection - Section with the searched key ; $_sKey - The searched key ; $_sDefault - [optional] The default return value. Default is ''. ; Return values .: Success The value of the passed key or if not set, the default value ; Failure The default value, set @error 1 - config file does'nt exist ; The default value, set @error 2 - config file is empty ; The default value, set @error 3 - none key-value-pairs in this section ; The default value, set @error 4 - key does'nt exist in this section ; The default value, set @error 5 - section does'nt exist ; Author ........: BugFix ; =============================================================================================================================== Func _CfgRead($_sCfg, $_sSection, $_sKey, $_sDefault='') If Not FileExists($_sCfg) Then Return SetError(1,0,$_sDefault) Local $aSectionLine, $aKeyVal, $iErr Local $aCfg = FileReadToArray($_sCfg) If @error = 2 Then Return SetError(2,0,$_sDefault) ; empty file For $i = 0 To UBound($aCfg) -1 If StringLeft($aCfg[$i], 1) = '#' Then ContinueLoop ; its a comment line - skip $aSectionLine = StringSplit($aCfg[$i], ';', 2) ; $STR_NOCOUNT (2) $iErr = @error If $aSectionLine[0] = $_sSection Then If $iErr = 1 Then Return SetError(3,0,$_sDefault) ; none key-value-pairs in this line For $j = 1 To UBound($aSectionLine) -1 $aKeyVal = StringSplit($aSectionLine[$j], '=', 2) ; $STR_NOCOUNT (2) If $aKeyVal[0] = $_sKey Then If UBound($aKeyVal) = 2 Then Return $aKeyVal[1] Else Return $_sDefault EndIf EndIf Next Return SetError(4,0,$_sDefault) EndIf Next Return SetError(5,0,$_sDefault) EndFunc ; #FUNCTION# ==================================================================================================================== ; Name ..........: _CfgWrite ; Description ...: Writes the value of a key in a section. ; Syntax ........: _CfgWrite($_sCfg, $_sSection, $_sKey, $_sValue) ; Parameters ....: $_sCfg - Path of the config file ; $_sSection - The section ; $_sKey - The key ; $_sValue - The value to store ; Return values .: Success 1 ; Author ........: BugFix ; =============================================================================================================================== Func _CfgWrite($_sCfg, $_sSection, $_sKey, $_sValue) If Not FileExists($_sCfg) Then Return FileWrite($_sCfg, StringFormat('%s;%s=%s\n', $_sSection, $_sKey, $_sValue)) EndIf Local $aSectionLine, $aKeyVal, $fH, $sLine, $iErr, $bReplaced Local $aCfg = FileReadToArray($_sCfg) If @error = 2 Then ; empty file $fH = FileOpen($_sCfg, 2) ; $FO_OVERWRITE (2) FileWrite($fH, StringFormat('%s;%s=%s\n', $_sSection, $_sKey, $_sValue)) Return FileClose($fH) EndIf For $i = 0 To UBound($aCfg) -1 If StringLeft($aCfg[$i], 1) = '#' Then ContinueLoop ; its a comment line - skip $aSectionLine = StringSplit($aCfg[$i], ';', 2) ; $STR_NOCOUNT (2) $iErr = @error If $aSectionLine[0] = $_sSection Then If $iErr = 1 Then ; none key-value-pairs in this line Return _FileWriteToLine($_sCfg, $i+1, StringFormat('%s;%s=%s', $_sSection, $_sKey, $_sValue), True) EndIf $sLine = $aSectionLine[0] $bReplaced = False For $j = 1 To UBound($aSectionLine) -1 $aKeyVal = StringSplit($aSectionLine[$j], '=', 2) ; $STR_NOCOUNT (2) If $aKeyVal[0] = $_sKey Then $sLine &= StringFormat(';%s=%s', $aKeyVal[0], $_sValue) $bReplaced = True Else $sLine &= StringFormat(';%s=%s', $aKeyVal[0], $aKeyVal[1]) EndIf Next If Not $bReplaced Then $sLine &= StringFormat(';%s=%s', $_sKey, $_sValue) Return _FileWriteToLine($_sCfg, $i+1, $sLine, True) EndIf Next ; section not found $fH = FileOpen($_sCfg, 1) ; $FO_APPEND (1) FileWrite($fH, StringFormat('%s;%s=%s\n', $_sSection, $_sKey, $_sValue)) Return FileClose($fH) EndFunc ; #FUNCTION# ==================================================================================================================== ; Name ..........: _CfgKeyDelete ; Description ...: Deletes a key-value-pair in a section ; Syntax ........: _CfgKeyDelete($_sCfg, $_sSection, $_sKey) ; Parameters ....: $_sCfg - Path of the config file ; $_sSection - Section with the searched key ; $_sKey - The key to delete ; Return values .: Success 1 ; Failure 0, set @error 1 - config file does'nt exist ; 0, set @error 2 - config file is empty ; 0, set @error 3 - none key-value-pairs in this section ; 0, set @error 4 - section does'nt exist ; Author ........: BugFix ; =============================================================================================================================== Func _CfgKeyDelete($_sCfg, $_sSection, $_sKey) If Not FileExists($_sCfg) Then Return SetError(1,0,0) Local $aSectionLine, $aKeyVal, $fH, $sLine, $iErr Local $aCfg = FileReadToArray($_sCfg) If @error = 2 Then Return SetError(2,0,0) ; empty file For $i = 0 To UBound($aCfg) -1 If StringLeft($aCfg[$i], 1) = '#' Then ContinueLoop ; its a comment line - skip $aSectionLine = StringSplit($aCfg[$i], ';', 2) ; $STR_NOCOUNT (2) $iErr = @error If $aSectionLine[0] = $_sSection Then If $iErr = 1 Then Return SetError(3,0,0) ; none key-value-pairs in this line $sLine = $aSectionLine[0] For $j = 1 To UBound($aSectionLine) -1 $aKeyVal = StringSplit($aSectionLine[$j], '=', 2) ; $STR_NOCOUNT (2) If $aKeyVal[0] = $_sKey Then ; do nothing, will not write again Else $sLine &= StringFormat(';%s=%s', $aKeyVal[0], $aKeyVal[1]) EndIf Next Return _FileWriteToLine($_sCfg, $i+1, $sLine, True) EndIf Next ; section not found Return SetError(4,0,0) EndFunc ; #FUNCTION# ==================================================================================================================== ; Name ..........: _CfgSectionDelete ; Description ...: Deletes a section ; Syntax ........: _CfgSectionDelete($_sCfg, $_sSection) ; Parameters ....: $_sCfg - Path of the config file ; $_sSection - The Section to delete ; Return values .: Success 1 ; Failure 0, set @error 1 - config file does'nt exist ; 0, set @error 2 - config file is empty ; 0, set @error 3 - section does'nt exist ; Author ........: BugFix ; =============================================================================================================================== Func _CfgSectionDelete($_sCfg, $_sSection) If Not FileExists($_sCfg) Then Return SetError(1,0,0) Local $aSectionLine Local $aCfg = FileReadToArray($_sCfg) If @error = 2 Then Return SetError(2,0,0) ; empty file For $i = 0 To UBound($aCfg) -1 If StringLeft($aCfg[$i], 1) = '#' Then ContinueLoop ; its a comment line - skip $aSectionLine = StringSplit($aCfg[$i], ';', 2) ; $STR_NOCOUNT (2) If $aSectionLine[0] = $_sSection Then Return _FileWriteToLine($_sCfg, $i+1, '', True) EndIf Next ; section not found Return SetError(3,0,0) EndFunc ; #FUNCTION# ==================================================================================================================== ; Name ..........: _CfgSectionList ; Description ...: Returns a array or string of all section names ; Syntax ........: _CfgSectionList($_sCfg[, $_bRetArray=True]) ; Parameters ....: $_sCfg - Path of the config file ; $_bRetArray - [optional] Return as array or delimited string, Default is True - Array ; Return values .: Success Array with all section names, count of sections on index [0] ; Failure 0, set @error 1 - config file does'nt exist ; 0, set @error 2 - config file is empty ; Author ........: BugFix ; =============================================================================================================================== Func _CfgSectionList($_sCfg, $_bRetArray=True) If Not FileExists($_sCfg) Then Return SetError(1,0,0) Local $aSectionLine, $aKeyVal, $sRet = '' Local $aCfg = FileReadToArray($_sCfg) If @error = 2 Then Return SetError(2,0,0) ; empty file For $i = 0 To UBound($aCfg) -1 If StringLeft($aCfg[$i], 1) = '#' Then ContinueLoop ; its a comment line - skip $aSectionLine = StringSplit($aCfg[$i], ';', 2) ; $STR_NOCOUNT (2) $sRet &= $aSectionLine[0] & ';' Next $sRet = StringTrimRight($sRet, 1) Return ($_bRetArray ? StringSplit($sRet, ';') : $sRet) EndFunc ; #FUNCTION# ==================================================================================================================== ; Name ..........: _CfgKeyList ; Description ...: Returns a array or string of all key names in a section ; Syntax ........: _CfgKeyList($_sCfg, $_sSection[, $_bRetArray=True]) ; Parameters ....: $_sCfg - Path of the config file ; $_sSection - Section to get the keys from ; $_bRetArray - [optional] Return as array or delimited string, Default is True - Array ; Return values .: Success 1 ; Failure 0, set @error 1 - config file does'nt exist ; 0, set @error 2 - config file is empty ; 0, set @error 3 - none key-value-pairs in this section ; 0, set @error 4 - section does'nt exist ; Author ........: BugFix ; =============================================================================================================================== Func _CfgKeyList($_sCfg, $_sSection, $_bRetArray=True) If Not FileExists($_sCfg) Then Return SetError(1,0,0) Local $aSectionLine, $aKeyVal, $iErr, $sRet = '' Local $aCfg = FileReadToArray($_sCfg) If @error = 2 Then Return SetError(2,0,0) ; empty file For $i = 0 To UBound($aCfg) -1 If StringLeft($aCfg[$i], 1) = '#' Then ContinueLoop ; its a comment line - skip $aSectionLine = StringSplit($aCfg[$i], ';', 2) ; $STR_NOCOUNT (2) $iErr = @error If $aSectionLine[0] = $_sSection Then If $iErr = 1 Then Return SetError(3,0,0) ; none key-value-pairs in this line For $j = 1 To UBound($aSectionLine) -1 $aKeyVal = StringSplit($aSectionLine[$j], '=', 2) ; $STR_NOCOUNT (2) $sRet &= $aKeyVal[0] & ';' Next $sRet = StringTrimRight($sRet, 1) Return ($_bRetArray ? StringSplit($sRet, ';') : $sRet) EndIf Next ; section not found Return SetError(4,0,0) EndFunc ; #FUNCTION# ==================================================================================================================== ; Name ..........: _CfgSectionGetArray ; Description ...: Returns a 2D array of all key-value-pairs in a section ; Syntax ........: _CfgSectionGetArray($_sCfg, $_sSection) ; Parameters ....: $_sCfg - Path of the config file ; $_sSection - Section to get the key-value-pairs from ; Return values .: Success 2D array: [[count_keys,section_name],[key_1,value],[key_2,value], .. [key_n,value]] ; Failure [[0,"error"]], set @error 1 - config file does'nt exist ; [[0,"error"]], set @error 2 - config file is empty ; [[0,"error"]], set @error 3 - section does'nt exist ; Author ........: BugFix ; =============================================================================================================================== Func _CfgSectionGetArray($_sCfg, $_sSection) Local $aSectionLine, $aKeyVal, $iErr, $iCnt, $aRet[1][2] = [[0,"error"]] If Not FileExists($_sCfg) Then Return SetError(1,0,$aRet) Local $aCfg = FileReadToArray($_sCfg) If @error = 2 Then Return SetError(2,0,$aRet) ; empty file For $i = 0 To UBound($aCfg) -1 If StringLeft($aCfg[$i], 1) = '#' Then ContinueLoop ; its a comment line - skip $aSectionLine = StringSplit($aCfg[$i], ';', 2) ; $STR_NOCOUNT (2) $iErr = @error $iCnt = UBound($aSectionLine) If $aSectionLine[0] = $_sSection Then If $iErr = 1 Then $aRet[0][1] = '' ; none key-value-pairs in this line Return $aRet EndIf ReDim $aRet[$iCnt][2] $aRet[0][0] = $iCnt -1 $aRet[0][1] = $_sSection For $j = 1 To UBound($aSectionLine) -1 $aKeyVal = StringSplit($aSectionLine[$j], '=', 2) ; $STR_NOCOUNT (2) $aRet[$j][0] = $aKeyVal[0] $aRet[$j][1] = (UBound($aKeyVal) = 2 ? $aKeyVal[1] : '') Next Return $aRet EndIf Next ; section not found Return SetError(3,0,$aRet) EndFunc
-
Wahnsinn Jungs/Mädels,
Vielen Dank für die Mühe. Werd die Infos und Funktionen mal alle verarbeiten und dann entscheiden, welchen Weg ich weiter gehe.