Problem mit INI-Dateien

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Problem mit INI-Dateien

Beitrag von AND51 »

Hallo!

Bei meinem Lieblingsprojekt benutze ich noch PB 3.94. Ich habe von Tactical Ops die cache.ini gespiegelt, also aus

Code: Alles auswählen

[cache]
key=value
wurde

Code: Alles auswählen

[cache]
value=key
damit ich das später besser abfragen kann. Auf diese gespiegelte Datei möchte ich nun zugreifen, die gespiegeltete Datei sieht so aus (Auszug):

Code: Alles auswählen

[cache]
TOST42.u=123678834B9AA1E283ED3F8903B8397D
TOSTClient.u=F1BB9A4D4BEB715838F7028D2CE301F7
TOSTGUICTRL.u=926405D0490313D66B53B5ADD906E3BD
TO-007-Stack.unr=FD7B00A2413D090CF982F0AF67E794F4
Nun stehen mir 3 Möglichkeiten zur Verfügung, mit denen ich denen ich den Buchstabensalat von z. B. TOST42.u abfragen will:
—OpenPreferences() / readPreferencesString() (PB)
—IniRead() (PBOSL)
—GetIniKey() ('ne andere Lib)

Das Problem: keine der 3 Möglichkeiten funktionieren. Wenn ich zum Beispiel den Code (welches nicht der MD5-HashCode der Dateien ist, es scheinen nur Zufallskombinationen zu sein) von TOST42.u oder jeder anderen beliebigen Datei lesen will, bekomme ich immer einen Leerstring zurück; liegt es daran, dass alle Keys einen Punkt im Namen haben? Oder was ist der Grund?
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
pLuSmaN
Beiträge: 10
Registriert: 11.09.2004 12:32

Beitrag von pLuSmaN »

Code: Alles auswählen

OpenPreferences("cache.ini")
PreferenceGroup("cache") ; [cache]
Debug ReadPreferenceString("TOST42.u", "default") ; gibt 123678834B9AA1E283ED3F8903B8397D aus
ClosePreferences()
Der oben angegebene Code funktioniert bei mir. Ich nehme mal an, du hast die PreferenceGroup nicht gesetzt.
Deine Schlüssel sind ja in der Gruppe cache und in der musst du auch suchen. Wenn es auch anders gehen sollte: Tut mir leid :P
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Ich verstehe das nicht, hier der Auszug aus meinem Programm:

Code: Alles auswählen

Procedure.s pfad()
	ProcedureReturn GetPathPart(GetRegKey(#HKEY_CURRENT_USER, "Software\AND-Software\"+#programm_name, "pfad"))
EndProcedure

		If OpenPreferences(pfad()+"Cache\mirror_cache.ini")
			PreferenceGroup("cache")
			For n=0 To CountGadgetItems(#cacheordner)
				If GetGadgetItemState(#cacheordner, n) = #PB_ListIcon_Checked
					SetGadgetText(#c1_ausgabe, c1_kopieredatei+Chr(10)+GetGadgetItemText(#cacheordner, n, 0))
				
					temp$=GetGadgetItemText(#cacheordner, n, 0)
					Debug temp$
					datei=pfad()+"Cache\"+ReadPreferenceString(temp$, "")+".uxx"
Dies scheint auf den ersten Blick ein wenig unüberischtlich, aber er stammt auch noch aus Zeiten, als ich bei LL's von Tuten und Blasen keine Ahnung hatte, ts, ts, ts... :lol:

Also. Ich ermittle mit der Prozedur pfad() den Pfad zu Tactical Ops (funktioniert 10%ig, wird auch woanders verwendet). Dem hänge ich den benötigten Ordner Cache an. Die von mir gespiegelte Datei heißt in Wirklichkeit mirror_cache.ini. Die FOR-Schleife, weil ich ein ListIconGadget() durchgehe, indem die Namen TOST42.u, TO-007-Stack.unr (s. o.) drinstehen und vom benutzer angeklickt werden können. Die gerade bearbeitete Datei wird via SetGadgetText() ausgegeben. Um es ausführlicher zu machen, lasse ich in temp$ den aktuelle Dateinamen speichern, falls er angewählt ist, hier landet dann z. B. TOST42.u. Dies wird unten eingesetzt und in datei (Typ .s) müsste dann der komplette Pfad zu TacticalOps\Cache\<CODE>.uxx stehen. Tactical Ops legt die temporäreren Dateien immer so Codemäßig an, also TOST42.u wird z. B. zu ksdgf786t234g8afd.uxx, k. A. warum der das so macht. Jedenfalls will ich auf diese Weise alle angeklickten Dateien umbennannen und woanders hinkopieren. Aber das geht nicht, weil die INI-Lesefunktionen patzen, und wie du siehst, habe ich PreferenceGroup() nicht vergessen. Woran könnte es dann liegen?
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
mk-soft
Beiträge: 3845
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

Hab mal wieder zu viel zeit.

Beispiel mit API

Code: Alles auswählen

NewList SectionsNames.s()
NewList Section.s()
; ---------------------------------------------------------
Procedure GetSectionsNames(path.s, *list.s())

  *buffer = AllocateMemory($4000)
  
  GetPrivateProfileSectionNames_(*buffer, $4000, path)
  
  *adr = *buffer
  Repeat
    temp.s = PeekS(*adr)
    If temp <> ""
      AddElement(*list())
      *list() = temp
    EndIf
    *adr + Len(temp) + 1
  Until temp = ""
  
  FreeMemory(*buffer)
  
EndProcedure
; ---------------------------------------------------------
Procedure GetSection(section.s, path.s, *list.s())

  *buffer = AllocateMemory($4000)
  
  GetPrivateProfileSection_(section, *buffer, $4000, path)
  
  *adr = *buffer
  Repeat
    temp.s = PeekS(*adr)
    If temp <> ""
      AddElement(*list())
      *list() = temp
    EndIf
    *adr + Len(temp) + 1
  Until temp = ""
  
  FreeMemory(*buffer)
  
EndProcedure
; ---------------------------------------------------------

path.s = GetCurrentDirectory() + "cache.ini"
GetSectionsNames(path, SectionsNames())

ForEach SectionsNames()
  Debug SectionsNames()
  ClearList(Section())
  GetSection(SectionsNames(), path, Section())
  ForEach Section()
    Debug Section()
  Next
Next
FF :wink:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Dool, danke! :allright:
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
mk-soft
Beiträge: 3845
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

NACHTRAG:

Bei INI-Dateien mit API fehlten noch zwei Funktionen

Code: Alles auswählen

; -------------------------------------------------------------------------------------------------
Procedure.s ReadINI(lpAppName.s, lpKeyName.s, lpFileName.s)

  Protected *lpReturnedString
  Protected lpDefault.s
  Protected Result.s
  
  *lpReturnedString = AllocateMemory(1024)
  lpDefault = ""
  GetPrivateProfileString_(lpAppName, lpKeyName, lpDefault, *lpReturnedString, 1024, lpFileName)
  Result.s = PeekS(*lpReturnedString)
  FreeMemory(*lpReturnedString)
  ProcedureReturn Result
  
EndProcedure
; -------------------------------------------------------------------------------------------------
Procedure WriteINI(lpszSection.s,	lpszKey.s, lpszString.s, lpszFile.s)

  result = WritePrivateProfileString_(lpszSection,	lpszKey, lpszString, lpszFile)
  
  ProcedureReturn result
  
EndProcedure
; -------------------------------------------------------------------------------------------------
path.s = GetCurrentDirectory() + "Cache.ini"
WriteINI("Cache", "User", "Hallo Welt", path)
Debug ReadINI("Cache", "User", path)
FF :wink:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten