Seite 1 von 1

Ersatz fuer Preference Befehle

Verfasst: 29.12.2004 19:29
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")

Verfasst: 29.12.2004 19:36
von 125
Super :allright:
Endlich Configfiles schreiben auf beiden Plattformen :)

Verfasst: 07.01.2005 23:13
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.

Verfasst: 22.05.2005 21:53
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