*Gelöst - Ordner für Programsettings?

Für allgemeine Fragen zur Programmierung mit PureBasic.
a14xerus
Beiträge: 1440
Registriert: 14.12.2005 15:51
Wohnort: Aachen

*Gelöst - Ordner für Programsettings?

Beitrag von a14xerus »

Wo sollte ein Program am besten seine Einstellungen hinspeichern?
oder regelt das Windows von alleine?

Wenn ein Programm im "Program Files" Ordner liegt kann es ja ohne Administratorrechte nicht dorthinschreiben.
Aber es kommt ja auch kein Fehler.

Also meine Frage:
Entweder: Wo sollte man sein Program die Einstellungen speichern lassen?
Oder: kann man einfach das eigene Verzeichnis nehmen und Windows regelt das von alleine?


//Edit: (Thread als gelöst markiert)
Meine ab jetzt benutzt Methode (Appdata-Folder)

Code: Alles auswählen

Procedure.s GetSpecialFolder(CSIDL.l)
  Protected *itemid.ITEMIDLIST
  Protected location.s = Space(#MAX_PATH)
  
  If SHGetSpecialFolderLocation_ (0, CSIDL, @*itemid) = #NOERROR
    If SHGetPathFromIDList_(*itemid, @location)
      CoTaskMemFree_(*itemid)
      If Right(location, 1) <> "\" : location + "\" : EndIf
      ProcedureReturn location
    EndIf
  EndIf
EndProcedure

Code: Alles auswählen

GetSpecialFolder(#CSIDL_APPDATA)
Zuletzt geändert von a14xerus am 27.05.2010 17:02, insgesamt 2-mal geändert.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Ordner für Programsettings?

Beitrag von STARGÅTE »

Ich würde vorschlagen für ein eigenes Programm immer einen eigenen Ordner in
C:\Dokumente und Einstellungen\.....\Anwendungsdaten
anzulegen
und dann dort alles zu speichern.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Little John

Re: Ordner für Programsettings?

Beitrag von Little John »

Wenn das Programm portabel ist sollten die Einstellungen im Programmverzeichnis gespeichert werden. (Man bewahrt portable Programme in Verzeichnissen auf in denen sie Schreibrechte haben.)

Ansonsten ist es unter Windows üblich, die Einstellungsdateien im Verzeichnis

Code: Alles auswählen

%APPDATA%\<Programmname>
zu speichern. (%APPDATA% ist eine Windows-Umgebungsvariable -- man kann sich keinesfalls darauf verlassen, dass das entspr. Verzeichnis immer auf Laufwerk C: oder sonst an einer bestimmten Stelle ist.)

Unter Linux im Verzeichnis

Code: Alles auswählen

~/.<Programmname>
Gruß, Little John
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Ordner für Programsettings?

Beitrag von ts-soft »

a14xerus hat geschrieben:Wo sollte ein Program am besten seine Einstellungen hinspeichern?
oder regelt das Windows von alleine?
Immer nach APPDATA\deine firma\deine software\das programm.prefs
Common-APPDATA für userunabhängige Einstellungen.
Bei Programmen ohne Vista-User-Manifest, welche ins Programverzeichnis speichern wollen, werden
diese im Kompatibilitätsmodus versetzt und das schreiben geschieht in Virtual Store
(APPDATA/Local/Virtual Store/...) ohne das man entsprechende Rückmeldungen erhält.
Dies bedeutet auch, das der Installer, welcher ja immer Admin-Rechte anfordert, dieses
Dinge nicht auffindet und nicht uninstallieren kann. Desweiteren sind die Einstellungen
verschwunden, wenn man das Programm mit Admin-Rechten startet. Sollte man also
tunlichst vermeiden, dies von Windows bestimmen zu lassen, zumal es für die meisten
Recht schwer ist diesen Ordner zu finden :mrgreen:
a14xerus hat geschrieben: Wenn ein Programm im "Program Files" Ordner liegt kann es ja ohne Administratorrechte nicht dorthinschreiben.
Aber es kommt ja auch kein Fehler.

Also meine Frage:
Entweder: Wo sollte man sein Program die Einstellungen speichern lassen?
Oder: kann man einfach das eigene Verzeichnis nehmen und Windows regelt das von alleine?
Programm-Verzeichnis sollte man lt. MS seid Win95 nicht mehr für Einstellungen nutzen, das wurde
zwar bisher meist ignoriert, aber die Zeit des ignorierens ist jetzt langsam vorbei.
Windows regeln lassen ist keine gute Idee, zumal diese Funktion auch abschaltbar ist und dies von
vielen PC-Zeitschriften empfohlen wurde, man weiß also nicht mehr, was das Programm situationsbedingt
genau macht.

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
a14xerus
Beiträge: 1440
Registriert: 14.12.2005 15:51
Wohnort: Aachen

Re: Ordner für Programsettings?

Beitrag von a14xerus »

Ok ich benutze jetzt das hier:

Code: Alles auswählen

Procedure.s GetSpecialFolder(CSIDL.l)
  Protected *itemid.ITEMIDLIST
  Protected location.s = Space(#MAX_PATH)
  
  If SHGetSpecialFolderLocation_ (0, CSIDL, @*itemid) = #NOERROR
    If SHGetPathFromIDList_(*itemid, @location)
      CoTaskMemFree_(*itemid)
      If Right(location, 1) <> "\" : location + "\" : EndIf
      ProcedureReturn location
    EndIf
  EndIf
EndProcedure

Code: Alles auswählen

GetSpecialFolder(#CSIDL_APPDATA)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Ordner für Programsettings?

Beitrag von ts-soft »

hier nochmal ein mehr komplettes Beispiel:

Code: Alles auswählen

Procedure.s GetSpecialFolder(CSIDL)
  Protected *itemid.ITEMIDLIST
  Protected location.s = Space(#MAX_PATH)
  
  If SHGetSpecialFolderLocation_ (0, CSIDL, @*itemid) = #NOERROR
    If SHGetPathFromIDList_(*itemid, @location)
      CoTaskMemFree_(*itemid)
      If Right(location, 1) <> "\" : location + "\" : EndIf
      ProcedureReturn location
    EndIf
  EndIf
EndProcedure 

Define.s MyPrefsPath
MyPrefsPath = GetSpecialFolder(#CSIDL_APPDATA)
MyPrefsPath + "a14xerus"
If FileSize(MyPrefsPath) <> - 2
  CreateDirectory(MyPrefsPath)
EndIf
MyPrefsPath + "\MyProgram"
If FileSize(MyPrefsPath) <> - 2
  CreateDirectory(MyPrefsPath)
EndIf
Debug MyPrefsPath
Tipp:
Für Crossplattform wäre es einfacher GetHomeDirectory() zu nutzen,
wobei das erste Verzeichnis "a14xerus" zu ".a14xerus" werden sollte und man
nur Slashes statt Backslashes verwendet.

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Little John

Re: Ordner für Programsettings?

Beitrag von Little John »

ts-soft hat geschrieben:Tipp:
Für Crossplattform wäre es einfacher GetHomeDirectory() zu nutzen
Uuups ... die Funktion war mir bisher noch gar nicht aufgefallen. :shock:
Nicht schlecht! :allright:

Gruß, Little John
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Ordner für Programsettings?

Beitrag von ts-soft »

Little John hat geschrieben:
ts-soft hat geschrieben:Tipp:
Für Crossplattform wäre es einfacher GetHomeDirectory() zu nutzen
Uuups ... die Funktion war mir bisher noch gar nicht aufgefallen. :shock:
Nicht schlecht! :allright:

Gruß, Little John
Für Crossplattform ist das schon okay, nutze ich gerade im aktuellem Projekt,
aber für nur Windows lieber den MS-Standard verwenden.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Little John

Re: Ordner für Programsettings?

Beitrag von Little John »

ts-soft hat geschrieben:aber für nur Windows lieber den MS-Standard verwenden.
Wieso das? Funktioniert GetHomeDirectory() unter Windows manchmal nicht korrekt?

Gruß, Little John
Benutzeravatar
al90
Beiträge: 1101
Registriert: 06.01.2005 23:15
Kontaktdaten:

Re: Ordner für Programsettings?

Beitrag von al90 »

Ich mache es dann meistens z.b. so:

Code: Alles auswählen

Procedure.s GetAndCreateConfigPath(FullPath$)

  Protected PrefsPath$

  If Right(FullPath$, 1)<>"\" : FullPath$+"\" : EndIf
  PrefsPath$ = FullPath$

  If OSVersion()=>#PB_OS_Windows_Vista
    PrefsPath$ = GetEnvironmentVariable("APPDATA") + "\" + StringField(FullPath$, CountString(FullPath$,"\"), "\") + "\"
  EndIf

  If MakeSureDirectoryPathExists_(@PrefsPath$) = #True
    ProcedureReturn PrefsPath$
  EndIf

EndProcedure


MyConfigPath$ = GetAndCreateConfigPath(GetPathPart(ProgramFilename())+"MeinAppName\")
Debug MyConfigPath$ ; <--- Returns ("") if fails.
Unter XP oder kleiner wird dann halt "C:\Programme\" benutzt, (Was i.d.R. auch klappen sollte) und ab Vista aufwerts
gehts dann unter Roaming\.
Antworten