Seite 1 von 3

*Gelöst - Ordner für Programsettings?

Verfasst: 01.04.2010 15:26
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)

Re: Ordner für Programsettings?

Verfasst: 01.04.2010 15:33
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.

Re: Ordner für Programsettings?

Verfasst: 01.04.2010 15:36
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

Re: Ordner für Programsettings?

Verfasst: 01.04.2010 15:39
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

Re: Ordner für Programsettings?

Verfasst: 01.04.2010 18:20
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)

Re: Ordner für Programsettings?

Verfasst: 01.04.2010 18:50
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

Re: Ordner für Programsettings?

Verfasst: 01.04.2010 19:40
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

Re: Ordner für Programsettings?

Verfasst: 01.04.2010 19:51
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.

Re: Ordner für Programsettings?

Verfasst: 01.04.2010 20:14
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

Re: Ordner für Programsettings?

Verfasst: 01.04.2010 20:18
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\.