Ersatz fuer Preference Befehle

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
dussel
Beiträge: 49
Registriert: 15.09.2004 12:52
Wohnort: Bei Frankfurt/Main

Ersatz fuer Preference Befehle

Beitrag von dussel »

Hallo,

wie bereits mehrfach diskutiert lassen die Preference Befehle keine Änderungen an vorhandenen Preference Files zu. Als Lösung steht eine Lib zur Verfügung.

Da ich Libs ungerne einsetze und keinen Code für Windows und Linux fand, habe ich mir eben auf die Schnelle mit PB Boardmitteln zwei Proceduren gebastelt. Ich hoffe jemand findet Verwendung oder optimiert die Funktion noch etwas.
  • - Lege eine neue Gruppe mit Key und Value an
    - Ändere den Value eines Key
    - Füge einen neuen Key einer bestehenden Gruppe hinzu
    - Lösche einen Key (durch value="")

Code: Alles auswählen

;
;   INI Manipulation
;
;   [Replacement for Preference Commandset]
;
;   Author: Dussel (http://www.absolut-marc.de)
;

Procedure.s lib_ini_change_entry(param_filename$,param_group$,param_key$,param_value$)
  ;
  ;   Create new Group
  ;   Add new Key 
  ;   Insert new Key
  ;   Delete Key (just set param_value$ to "")

  param_group$  = "["+param_group$+"]"
  
  tmp_filename$ = param_filename$+".tmp"

  tmp_fid_w = OpenFile(#pb_any,tmp_filename$)
  tmp_fid_r = ReadFile(#pb_any,param_filename$) 

  If tmp_fid_r
      While Eof(tmp_fid_r)=0
        UseFile(tmp_fid_r)
        tmp_zeile$ = ReadString()
        If tmp_zeile$=param_group$
            UseFile(tmp_fid_w)
            WriteStringN(tmp_zeile$) 
            While tmp_flag_end=0
              UseFile(tmp_fid_r)
              tmp_zeile$  = ReadString()
              tmp_pos     = FindString(tmp_zeile$,"=",1)
              If tmp_pos=0
                  UseFile(tmp_fid_w)
                  If tmp_flag_written=0 And Len(param_value$)>0
                    UseFile(tmp_fid_w)
                    WriteStringN(param_key$+"="+param_value$)
                    tmp_flag_written=1
                  EndIf
                  UseFile(tmp_fid_w)
                  WriteStringN(tmp_zeile$) 
                  tmp_flag_end=1              
                Else
                  tmp_zeile2$=Mid(tmp_zeile$,1,tmp_pos-1)
                  If tmp_zeile2$ = param_key$
                      ; Key found
                      If Len(param_value$)>0
                          UseFile(tmp_fid_w)
                          WriteStringN(param_key$+"="+param_value$)
                          tmp_flag_written=1
                        Else
                          tmp_flag_written=1
                      EndIf
                    Else
                      UseFile(tmp_fid_w)
                      WriteStringN(tmp_zeile$)              
                  EndIf
              EndIf
            Wend
          Else
            UseFile(tmp_fid_w)
            WriteStringN(tmp_zeile$) 
        EndIf
      Wend 
      CloseFile(tmp_fid_r) 
      If tmp_flag_written=0 And Len(param_value$)>0
        ; Add Group with key and values     
        UseFile(tmp_fid_w)
        WriteStringN(param_group$)
        WriteStringN(param_key$+"="+param_value$)
      EndIf
    Else
      If Len(param_value$)>0
        ; Add Group with key and values     
        UseFile(tmp_fid_w)
        WriteStringN(param_group$)
        WriteStringN(param_key$+"="+param_value$)
      EndIf
  EndIf
  
  CloseFile(tmp_fid_w)
  CopyFile(tmp_filename$, param_filename$) 
  DeleteFile(tmp_filename$)
  
EndProcedure



Procedure.s lib_ini_read_entry(param_filename$,param_group$,param_key$)
  ;
  ;

  param_group$  = "["+param_group$+"]"
  
  tmp_fid_r = ReadFile(#pb_any,param_filename$) 

  If tmp_fid_r
      While Eof(tmp_fid_r)=0 And tmp_flag_end=0
        tmp_zeile$ = ReadString()
        If tmp_zeile$=param_group$
            While tmp_flag_end=0
              UseFile(tmp_fid_r)
              tmp_zeile$  = ReadString()
              tmp_pos     = FindString(tmp_zeile$,"=",1)
              If tmp_pos=0
                  ; End of Group
                  tmp_flag_end=1              
                Else
                  tmp_zeile2$=Mid(tmp_zeile$,1,tmp_pos-1)
                  If tmp_zeile2$ = param_key$
                      ; Key found
                      retval$=Mid(tmp_zeile$,Len(param_key$)+2,Len(tmp_zeile$)-Len(param_key$)-1)
                  EndIf
                  tmp_flag_end=1
              EndIf
            Wend
        EndIf
      Wend 
      CloseFile(tmp_fid_r)
  EndIf
  
  ProcedureReturn retval$
  
EndProcedure



param_filename$ = "./test.txt"

lib_ini_change_entry(param_filename$,"test","key1","1")
lib_ini_change_entry(param_filename$,"test","key1","")
lib_ini_change_entry(param_filename$,"test","key1","Wert1")
lib_ini_change_entry(param_filename$,"test","key2","Wert2")
lib_ini_change_entry(param_filename$,"test","key3","Wert3")
lib_ini_change_entry(param_filename$,"test3","key3","Wert in Test3")
lib_ini_change_entry(param_filename$,"test4","key3","")
lib_ini_change_entry(param_filename$,"test5","key1","Ergebnis Wert1")
lib_ini_change_entry(param_filename$,"test","key1","Wert1 in Key1")


Debug lib_ini_read_entry(param_filename$,"test5","key1")
Benutzeravatar
125
Beiträge: 1322
Registriert: 19.09.2004 16:52
Wohnort: Neu Wulmstorf (Hamburg)
Kontaktdaten:

Beitrag von 125 »

Super :allright:
Endlich Configfiles schreiben auf beiden Plattformen :)
Benutzeravatar
Donald
Beiträge: 307
Registriert: 03.01.2005 02:21
Wohnort: Marl

Beitrag von Donald »

Hi,
hatte mir damals in GFA auch eine eigene Routine geschrieben als ich
feststellen mußte das die API Befehle:
GetPrivateProfileString
WritePrivateProfileString
nur solange einwandfrei gearbeitet hatten, wie das File kleiner als
64KB war, dann wurde das File zum Teil zerstört.

Mit der eigene Routine hatte ich dann File mit ein paar MB einwandfrei
lesen und schreiben können.

Mal schauen ob ich die mal ins PureBasic übertrage.
Muß mich da erst ein wenig mehr einarbeiten, ist halt doch eine kleine
Umstellung.
DONALD :D www.PureBasic-Donald.de gibt es im Moment nicht mehr
PureBasic - jaPBe - PureVisonXP - TailBite
Dristar
Beiträge: 72
Registriert: 13.09.2004 12:46

Beitrag von Dristar »

hallo !!

weil ich gerade dein rotine brauche :) . Habe ich einen fehler endeckt.
Was heist endeckt :? ich habe ihn noch nicht gefunden.

Die Rotine gibt ein key nicht zurück

code beispiel

Code: Alles auswählen


param_filename$ = "./autostart.ini"

lib_ini_change_entry(param_filename$,"einstellung","spath","C:\Dokumente und Einstellungen\Systemlord\Desktop\Logo\")
lib_ini_change_entry(param_filename$,"einstellung","zfiles","345353355")

Debug lib_ini_read_entry(param_filename$,"einstellung","zfiles") 
mfg Dristar
Antworten