Autor Beitrag
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19096
Erhaltene Danke: 1704

W10 x64 (Chrome, Edge)
Delphi 10.4 Ent, Oxygene, C# (VS 2019), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 08.02.09 23:30 
Nicht in den Ordner der Exe schreiben (Rechteprobleme) / Lösung [meta]Verzeichnis[/meta][meta]absolut[/meta][meta]relativ[/meta][meta]Schreibrechte[/meta][meta]Administratorrechte[/meta]

Wenn ein Programm unter c:\programme liegt, dann hat man dort nicht immer Schreibrechte. Man darf also als Programmierer (normalerweise) nicht davon ausgehen, dass man in das Verzeichnis schreiben kann, in dem die Exe liegt.

Leider ist man unter XP bei einer Standardinstallation eines einzelnen Benutzers Administrator, weshalb viele dieses Problem gar nicht bemerken. Unter Vista ist man dagegen nur noch Standardbenutzer, daher funktioniert das Schreiben unter c:\programme nicht mehr.
Das Resultat ist, dass unsauber programmierte Software, die Daten und Einstellungen versucht im Verzeichnis der Exe zu speichern, unter Vista nicht mehr läuft bzw. dort Administratorrechte braucht.

Die Frage ist dann natürlich:

Wo soll ich Daten des Programms sonst speichern?
Konfigurationseinstellungen lassen sich sehr gut in der Registry speichern, die genau dafür gedacht ist.
Andere Daten oder INI-Dateien gehören in das "Anwendungsdatenverzeichnis", das unter XP z.B. unter c:\Dokumente und Einstellungen\<Benutzer>\Lokale Einstellungen\Anwendungsdaten\DeinName\DeinProgramm liegt. Dafür gibt es hier in der Library die Funktion GetSpecialFolder, die dabei hilft dieses Verzeichnis zu finden:
www.delphi-library.de/viewtopic.php?t=9428

Der Quelltext zum Speichern sieht dann so aus:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
const
  AppDataRootDir = '\Sebastian Jänicke';
  AppDataProjectDir = '\AppDir Testprojekt';

// ...

// Die hier benutzte Funktion GetSpecialFolder gibt es unter:
// http://www.delphi-library.de/viewtopic.php?t=9428
procedure TfrmMain.btnSaveToAppDataDirClick(Sender: TObject);
var
  UserAppDataDir: String;
begin
  UserAppDataDir := GetSpecialFolder(CSIDL_LOCAL_APPDATA);
  ForceDirectories(UserAppDataDir + AppDataRootDir + AppDataProjectDir);
  memTestDisplay.Lines.SaveToFile(UserAppDataDir

    + AppDataRootDir + AppDataProjectDir + '\test.txt');
end;
Das alles wird in dem oben angehängten Demo-Projekt auch gezeigt.

Wichtig zu dem Thema noch: Es gibt ein solches Anwendungsdatenverzeichnis für alle Benutzer auf dem PC und nur für den aktuellen, außerdem (für eine Netzwerkanmeldung) eines für den Benutzer für alle PCs im Netzwerk.
Je nachdem ob die Daten für alle oder nur für den aktuellen Benutzer sind, muss dann der für das eigene Programm passende Ordner benutzt werden.

Mehr zu den Möglichkeiten findet sich in diesem FAQ Beitrag von mir unter Punkt 2:
www.delphi-library.d...ewtopic.php?p=541637
Der Beitrag zeigt eine Lösung für das Speichern der Konfigurationseinstellungen eines Programms und vereinfacht dies gleichzeitig.

Eine portable Software soll natürlich in das eigene Verzeichnis schreiben, dafür ist sie da. Solche Software muss dann in einem beschreibbaren Verzeichnis (USB-Stick, Eigene Dateien, ...) liegen. Wenn man zuerst im eigenen Verzeichnis und dann in den Anwendungsdaten nach den Einstellungen sucht, dann kann man auch portabel und installierbar bleiben und es dem Benutzer als Auswahl anbieten, mehr dazu steht auch in dem Link im vorherigen Absatz.

Eine Demo befindet sich im Anhang, die auch das Thema dieses Beitrags abdeckt:
www.delphi-library.d...ewtopic.php?p=499701
(Der Beitrag erklärt, warum man überhaupt immer ein Verzeichnis angeben muss, wenn man auf Dateien zugreift.)

Der Quelltext ist nicht weiter kommentiert, aber die Delphi-Hilfe sollte Befehle wie ForceDirectories etc. erklären ;-).

Schönen Gruß,
Sebastian Jänicke


Anwendungsverzeichnis Tests.zip  (237.33 KB) Download (Rev 0)
 (1309x, 1309x gesamt)
Beschreibung:  


Zuletzt bearbeitet von jaenicke am So 15.02.09 21:33, insgesamt 3-mal bearbeitet