Wo Lege ich meine Userdaten hin ?..

Antworten
Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1498
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Wo Lege ich meine Userdaten hin ?..

Beitrag von corpsman »

Guten Morgen allerseits,

Wie ja evtl. bekannt, bin ich eigentlich Linux User und verdränge ähh vergesse immer mehr wie das unter Windoof so funktioniert hat.

Zu meiner Frage.

Ich habe also ein Programm geschrieben, welches die Firma für welche ich arbeite (bin so stolz dass ich meinen Chef überzeugen konnte Lazarus ein zu setzen) nun verkaufen will. Klar dass da ein Installer dabei ist und der Kunde das Programm natürlich überall hin kopieren kann. Nun ist es so, dass ein Kollege während unserer Tests hier im Haus das Programm nach "C:\Program Files\ProgrammName\" kopieren hat lassen (Programm Files, weil seit Virus Vista das System ja immer in Englisch ist, auch wenn der User es normalerweise in Deutsch sieht). Ansich ist das alles natürlich kein Problem, solange meine Anwendung keine Daten speichert, was sie natürlich macht. Selbstverständlich ist der Kollege kein Admin auf seiner Maschine und unter Windoof 7 stürzt meine Anwendung dann aufrund fehlender Schreibrechte in "C:\Program Files" ab.

Die Frage ist nun also, wo Speichere ich meine UserDaten korreckt ab. Bzw. Gibt es eine Funktion welche mir unter Windoof XP, Vista und 7 einen Basisordnernamen Liefert in dem ich auch ohne Admin Rechte Garantiert Schreib rechte habe ?
Ich denke da an so Ordner wie "C:\Dokumente und Einstellungen\<username>\Anwendungsdaten". Oder gibt es etwa noch andere "saubere" Wege Userdaten zu speichern (die TRegistry kenne ich, reicht mir aber nicht aus, da ich Client Programme aufrufe, welche mittels "Datei Nachrichten" mit mir Kommunizieren, ich benötige also in jedem Fall einen Ordner in dem ich Dateien erstellen und löschen darf).

Grüße aus der Linux Welt

Corpsman
--
Just try it

Benutzeravatar
willi4willi
Lazarusforum e. V.
Beiträge: 155
Registriert: Sa 1. Nov 2008, 18:06
OS, Lazarus, FPC: Windows, Linux (debian) / Lazarus 3.2 / FPC 3.2.2
CPU-Target: i386, win64, arm

Re: Wo Lege ich meine Userdaten hin ?..

Beitrag von willi4willi »

Guten Morgen!

Also mein Tipp wäre, die Daten im Benutzerprofil abzulegen. Wenn im Netzwerk wandernde Profile verwendet werden, dann sollte man darauf achten, dass das Zielverzeichnis nicht mit dem Server synchronisiert wird.

Das Benutzerprofil erhält man mit

Code: Alles auswählen

getenvironmentvariable('USERPROFILE');



Müssen andere lokale User ebenfalls darauf zugreifen?

Wenn andere User auch Zugriff benötigen, dann ist dieses Verzeichnis sicherlich besser:

Code: Alles auswählen

getenvironmentvariable('PUBLIC');


Für größere Applikationen lege ich Daten immer auf einer separaten Partition/Laufwerk ab. Wenn man mal Windows neu installieren muss (soll ja vorkommen), dann sind diese wenigstens nicht betroffen.


Viele Grüße

Willi4willi

PS: Ich nutze Windows 7.
 

Viele Grüße

Willi4Willi

------------

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1498
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Wo Lege ich meine Userdaten hin ?..

Beitrag von corpsman »

also

Code: Alles auswählen

getenvironmentvariable('USERPROFILE');


sieht schon echt gut an, zeigt bei mir auf "C:\Dokumente und Einstellungen\<User>"

Da fehlt quasi noch das "Anwendungsdaten", ich hätte aber auch keinen Schmerz damit, in dem User Verzeichniss direkt mein Unterverzeichniss an zu legen.

Ein Netzwerklaufwerk, darf ich auf keinen Fall nutzen, denn die Client Anwendung welche ich benutze, kann ( aus welchen Gründen auch immer ) nicht mit Dateien auf Netzlaufwerken arbeiten.

Da kommen natürlich gleich die Nächsten Fragen auf :

o Wo kann ich einsehen was für "mögliche" Parameter ich "getenvironmentvariable" übergeben darf, evtl finde ich so noch einen geeigneteren
=> bzw. Hat Google mir http://en.wikipedia.org/wiki/Environment_variable vorgeschlagen und da gibts das Wort "APPDATA", das sieht sehr nach dem aus was ich haben will, kennst du das ?

o Funktioniert das Plattformunabhängig ? Denn zumindest zur Zeit noch könnte meine Anwendung auch auf Linux/ Mac Laufen und ich würde mir dann im Source Vermerken wenn das nicht Portable ist...
--
Just try it

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Wo Lege ich meine Userdaten hin ?..

Beitrag von Socke »

Für den ganzen Spaß hier gibt es doch schon fertige Funktionen in der Unit Sysutils.

GetUserDir() liefert das Benutezerverzeichnis. Dort Anwendungsdaten abzulegen ist zwar üblich, gehört aber nicht zum guten Ton (der Benutzer muss die Dateien schließlich nicht immer manuell öffnen).

GetAppConfigDir() gibt dir ein Verzeichnis für Konfigurationsdateien zurück. Unter Windows wird da auf die Umgebungsvariable APPDATA zurückgegriffen.

Eine Übersicht über die aktuellen Umgebungsvariablen erhältst du unter Windows mit set und unter Linux mit env, jeweils auf der Konsole eingegeben.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Wo Lege ich meine Userdaten hin ?..

Beitrag von mschnell »

Prinzipiell gibt es (mindestens) drei Arten von Konfigurations-Daten:

1) Solche, die nur bei der Installation (also i.A. vom Administrator) schreibbar sind und vom normalen User nur gelesen werden können. Sie gelten unabhängig davon, welcher User das Programm startet. ( GetAppConfigDir() )

2) Solche die für jeden User unabhängig sind (kann nur der aktuelle User lesen und schreiben) ( GetUserDir() )

3) Solche, die dynamisch für alle User gemeinsam sind (kann jeder User lesen und schreiben). (Recht selten gebraucht. )

Für alle gibt es entsprechende (Betriebssystem-abhängige) Positionen und (hoffentlich) (Betriebssystem-unabhängige) Funktionen in der LCL, um sie herauszufinden.

Ich habe (für Delphi) einmal eine erweiterte TInifile Klasse gebaut, die eine Property zur Selektion einer der drei Varianten hat.

-Michael

Heinrich Wolf
Beiträge: 323
Registriert: Di 12. Apr 2011, 13:21
OS, Lazarus, FPC: WinXP + VMWare Player mit Fedora14, L 1.1, FPC 2.7.1
CPU-Target: 1core 1,8GHz 32Bit
Wohnort: Fürth
Kontaktdaten:

Re: Wo Lege ich meine Userdaten hin ?..

Beitrag von Heinrich Wolf »

In Lazarus ist das, was ich hier schreibe, nicht vorbereitet, weil Lazarus für mehr Platformen als nur Windows compilieren soll. Ich hab es trotzdem mal aus meinem Delphi 5 herauskopiert, weil es hilft, mit Windows konform zu gehen.

Code: Alles auswählen

const shell32 = 'shell32.dll';
 
const
  CSIDL_DESKTOP                   = $0000;
  CSIDL_INTERNET                  = $0001;
  CSIDL_PROGRAMS                  = $0002;
  CSIDL_CONTROLS                  = $0003;
  CSIDL_PRINTERS                  = $0004;
  CSIDL_PERSONAL                  = $0005;
  CSIDL_FAVORITES                 = $0006;
  CSIDL_STARTUP                   = $0007;
  CSIDL_RECENT                    = $0008;
  CSIDL_SENDTO                    = $0009;
  CSIDL_BITBUCKET                 = $000a;
  CSIDL_STARTMENU                 = $000b;
  CSIDL_MYMUSIC                   = $000d;
  CSIDL_MYVIDEO                   = $000e;
  CSIDL_DESKTOPDIRECTORY          = $0010;
  CSIDL_DRIVES                    = $0011;
  CSIDL_NETWORK                   = $0012;
  CSIDL_NETHOOD                   = $0013;
  CSIDL_FONTS                     = $0014;
  CSIDL_TEMPLATES                 = $0015;
  CSIDL_COMMON_STARTMENU          = $0016;
  CSIDL_COMMON_PROGRAMS           = $0017;
  CSIDL_COMMON_STARTUP            = $0018;
  CSIDL_COMMON_DESKTOPDIRECTORY   = $0019;
  CSIDL_APPDATA                   = $001a;
  CSIDL_PRINTHOOD                 = $001b;
  CSIDL_ALTSTARTUP                = $001d;
  CSIDL_COMMON_ALTSTARTUP         = $001e;
  CSIDL_COMMON_FAVORITES          = $001f;
  CSIDL_INTERNET_CACHE            = $0020;
  CSIDL_COOKIES                   = $0021;
  CSIDL_HISTORY                   = $0022;
  CSIDL_WINDOWS                   = $0024;
  CSIDL_PROGRAM_FILES             = $0026;
  CSIDL_MYPICTURES                = $0027;
  CSIDL_PROFILE                   = $0028;
 
function SHGetSpecialFolderPathA(hwndOwner: HWND; lpszPath: PAnsiChar; nFolder: Integer; fCreate: BOOL): BOOL; stdcall;
function SHGetSpecialFolderPathW(hwndOwner: HWND; lpszPath: PWideChar; nFolder: Integer; fCreate: BOOL): BOOL; stdcall;
function SHGetSpecialFolderPath(hwndOwner: HWND; lpszPath: PChar; nFolder: Integer; fCreate: BOOL): BOOL; stdcall;
function SHGetSpecialFolderPathA;     external shell32 name 'SHGetSpecialFolderPathA'
function SHGetSpecialFolderPathW;     external shell32 name 'SHGetSpecialFolderPathW'
function SHGetSpecialFolderPath;      external shell32 name 'SHGetSpecialFolderPathA'


Siehe auch
http://msdn.microsoft.com/en-us/library/windows/desktop/bb762204%28v=vs.85%29.aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/bb762181%28v=vs.85%29.aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/bb762188%28v=vs.85%29.aspx

Heinrich Wolf
Beiträge: 323
Registriert: Di 12. Apr 2011, 13:21
OS, Lazarus, FPC: WinXP + VMWare Player mit Fedora14, L 1.1, FPC 2.7.1
CPU-Target: 1core 1,8GHz 32Bit
Wohnort: Fürth
Kontaktdaten:

Re: Wo Lege ich meine Userdaten hin ?..

Beitrag von Heinrich Wolf »

Ich hab sie in der online Hilfe nicht gefunden, aber die Deklarationen, die ich aufgelistet habe, sind auch in Lazarus vorhanden.
Einfach uses ShlObj einfügen.

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1498
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Wo Lege ich meine Userdaten hin ?..

Beitrag von corpsman »

Also wenn ich Socke richtig verstehe, dann sollte ich

GetAppConfigDir()

nehmen. Denn das ist Betriebsystemunabhängig und macht mit dem Parameter (False) eigentlich auch, dass was ich will.

Ist aber nicht = Appdata denn :

AppData = C:\Dokumente und Einstellungen\<UserName>\Anwendungsdaten

GetAppConfigDir(false ) = C:\Dokumente und Einstellungen\<UserName>\Lokale Einstellungen\Anwendungsdaten
--
Just try it

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Wo Lege ich meine Userdaten hin ?..

Beitrag von Socke »

mschnell hat geschrieben:1) Solche, die nur bei der Installation (also i.A. vom Administrator) schreibbar sind und vom normalen User nur gelesen werden können. Sie gelten unabhängig davon, welcher User das Programm startet. ( GetAppConfigDir() )

2) Solche die für jeden User unabhängig sind (kann nur der aktuelle User lesen und schreiben) ( GetUserDir() )

Die Funktion GetAppConfigDir() liefert je nach Parameter das Verzeichnis für Dateien wie unter Punkt #1 und Punkt #2 beschrieben. Direkt in das Benutzer-Verzeichnis gehören keine Konfigurationsdateien! Dazu gibt es Unterverzeichnisse, damit nicht zwischen den selbst erstellten Daten auch noch unbekannte Dateien in unbekannter Anzahl von unbekannten Programmen herumliegen. Unter Windows NT ist das AppData ("Anwendungsdaten"); unter Linux .config.

Jetzt ratet mal, warum beide Verzeichnisse versteckt sind ...

Edit: Die Frage ist, welche Daten du speichern möchtest. Das Verzeichnis Anwendungsdaten ist für benutzerabhängige aber rechnerunabhängige Programmdaten. Lokale Einstellungen ist für benutzer- und rechnerabhängige Programmdaten. Einen guten Überblick -- auch über die Änderungen zu den Win-XP-Nachfolgern -- findest du bei Microsoft

Edit2: Free Pascal übernimmt diese Unterscheidung nicht beziehungsweise bietet nur eine Funktion für ein Verzeichnis an.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1498
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Wo Lege ich meine Userdaten hin ?..[gelöst]

Beitrag von corpsman »

ups sry,

natürlich lege ich in Anwendugnsdaten noch ein passendes Unterverzeichniss an, alles andere wäre "Grob Fahrlässig"

Socke hat geschrieben:Lokale Einstellungen ist für benutzer- und rechnerabhängige Programmdaten


Im Prinzip ist es genau dass was ich speichern will. Deswegen passt GetAppConfigDir(false) auch wunderbar. Nachdem ich mit dem Programm aber eben Beruflich unterwegs bin und nicht irgend nen kostenlosten Privat Kram mache, wollte ich quasi eure weiterführende Meinung dazu.

Vielen Dank allen beteiligten.
--
Just try it

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: Wo Lege ich meine Userdaten hin ?..

Beitrag von Komoluna »

Hallo Leute

Ich habe folgendes Problem:

Weder

Code: Alles auswählen

Getuserdir(false);//oder (true);

noch

Code: Alles auswählen

GetEnvironmentVariable('...')

funktionieren bei mir, es kommt immer die compilermeldung:

Code: Alles auswählen

Unit1.pas(...,...) Error: Wrong number of parameters specified for call to "GetUserDir"// oder "GetEnvironmentVariable"


Vieleicht liegt das an meiner Lazarus-version...(1.0), denn früher als ich noch 0.9.... hatte ging das noch...

Bitte um Hilfe,

Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Wo Lege ich meine Userdaten hin ?..

Beitrag von theo »

Wie kommst du auf die Idee, GetUserDir benötige einen Parameter?

Warum schaust du nicht einfach nach im Quellcode, oder in der Hilfe?

http://lazarus-ccr.sourceforge.net/docs ... erdir.html

:roll:

jwdietrich
Beiträge: 167
Registriert: Mo 20. Okt 2008, 20:50
OS, Lazarus, FPC: macOS 10.4-13.4, Windows 2000-11, Raspbian (L 2.2.6, FPC 3.2.2)
CPU-Target: PowerPC, Intel, ARM
Wohnort: Hattingen, NRW
Kontaktdaten:

Re: Wo Lege ich meine Userdaten hin ?..

Beitrag von jwdietrich »

Leider ist GetAppConfigDir nicht so wirklich plattformunabhängig, da es auf dem Mac ein falsches Verzeichnis zurückliefert.

Funktionsfähig auf Mac, Windows und Linux ist die folgende Funktion, die ich in meinen Programmen verwende:

Code: Alles auswählen

function GetPreferencesFolder: String;
  { platform-independend method to search for the location of preferences folder}
const
  kMaxPath = 1024;
var
  {$IFDEF DARWIN}
  theError: OSErr;
  theRef: FSRef;
  {$ENDIF}
  pathBuffer: PChar;
begin
  {$IFDEF DARWIN}
    try
      pathBuffer := Allocmem(kMaxPath);
    except on exception do exit;
    end;
    try
      Fillchar(pathBuffer^, kMaxPath, #0);
      Fillchar(theRef, Sizeof(theRef), #0);
      theError := FSFindFolder(kOnAppropriateDisk, kPreferencesFolderType, kDontCreateFolder, theRef);
      if (pathBuffer <> nil) and (theError = noErr) then
      begin
        theError := FSRefMakePath(theRef, pathBuffer, kMaxPath);
        if theError = noErr then GetPreferencesFolder := UTF8ToAnsi(StrPas(pathBuffer)) + '/';
      end;
    finally
      Freemem(pathBuffer);
    end
  {$ELSE}
    GetPreferencesFolder := GetAppConfigDir(false);
  {$ENDIF}
end;

Antworten