Autor Beitrag
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 28.04.08 01:25 
Warum bei Dateinamen der Pfad mit angegeben werden muss[meta]Verzeichnis[/meta][meta]absolut[/meta][meta]relativ[/meta][meta]Schreibrechte[/meta][meta]Administratorrechte[/meta]

Da es ein sehr häufiger Fehler ist, dass die Angabe eines Verzeichnisses fehlt, wenn auf Dateien zugegriffen wird, schreibe ich dazu einmal eine Erklärung warum es notwendig ist ein Verzeichnis immer anzugeben.

Dazu gibt es eine Demonstration wie einfach dabei ein Fehler auftritt, wenn man das Verzeichnis weglässt. Wer es einfach nur kurz sehen möchte, der lädt bitte einfach mal das Demoprojekt aus dem Anhang herunter und testet es. ;-)


Hinweis:
Die beste Lösung ist aber gar nicht, das Verzeichnis zu benutzen, in dem das eigene Programm liegt, denn nicht immer kann man es beschreiben. Unter XP ohne Adminrechte und unter Vista immer kann man unter c:\programme nicht schreiben.
Mehr dazu (fehlende Schreibrechte im Verzeichnis des eigenen Programms) in diesem Beitrag: www.delphi-library.d...ewtopic.php?p=548600


Aber weiter im Text:
Worum es bei der fehlenden Angabe eines Verzeichnisses geht ist folgendes. Angenommen, man möchte die Konfigurationsdatei im selben Verzeichnis wie das Programm auslesen:

Falsch:
ausblenden Delphi-Quelltext
1:
Memo1.Lines.LoadFromFile('config.ini');					

Richtig:
ausblenden Delphi-Quelltext
1:
Memo1.Lines.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'config.ini');					

Um zu verstehen, warum der erste Quelltext nicht immer das gewünschte macht (das wäre ja im Anwendungsverzeichnis die Datei suchen), muss man verstehen, was dabei passiert. Wenn ihr in die Eigenschaften einer Verknüpfung schaut, dann findet ihr dort u.a. "Ausführen in:". Dort kann man das Arbeitsverzeichnis angeben, das die Anwendung beim Start haben soll. Auch bei ShellExecute u.ä. kann man dieses angeben.
Dieses wird benutzt, wenn man keinen kompletten Pfad sondern nur einen Dateinamen oder einen relativen Pfad angibt und nicht das Verzeichnis, in dem das Programm sich befindet.

Jetzt fragt ihr bestimmt, warum der erste Quelltext trotzdem oft funktioniert. Ganz einfach: Ist kein anderes Arbeitsverzeichnis angegeben, ist dieses beim Start das in dem die Exe liegt.

Und jetzt kommt bestimmt: Wo ist das Problem?
Nun ja, das Arbeitsverzeichnis ist nicht fest. Schon der Aufruf eines Öffnen-Dialogs ändert dieses...

Dazu habe ich eine kleine Demo-Anwendung geschrieben, die ihr im Anhang findet. Dort wird im Grunde diese Befehlssequenz ausgeführt: (der Inhalt des Memos wird in test.txt gespeichert, das Memo geleert, die Datei wieder geladen, dann ein Öffnen-Dialog angezeigt, wo man eine Datei in einem anderen Verzeichnis auswählen muss, und dann wieder versucht mit dem selben Quelltext die Datei test.txt wieder zu laden)
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
// ACHTUNG: Das ist eine Demo wie es NICHT funktioniert!!!
  memTestDisplay.Lines.SaveToFile('test.txt');
  memTestDisplay.Lines.Clear;
  memTestDisplay.Lines.LoadFromFile('test.txt');

  if dlgOpenFile.Execute then
    memTestDisplay.Lines.LoadFromFile(dlgOpenFile.FileName);

  memTestDisplay.Lines.Clear;
  memTestDisplay.Lines.LoadFromFile('test.txt');
Das erste LoadFromFile wird funktionieren, denn das Arbeitsverzeichnis hat sich nicht geändert. Nach dem Ausführen des Dialogs ist das Arbeitsverzeichnis aber ein anderes (vorausgesetzt man wählt nicht gerade das Verzeichnis des Demoprojekts selbst aus, was im echten Quelltext aber auch geprüft wird^^). Das zweite LoadFromFile wird nicht mehr funktionieren, obwohl der Quelltext der selbe ist, denn es wird jetzt in dem Verzeichnis gesucht, den man mit dem Öffnen-Dialog ausgewählt hat...

Fazit: Immer, wirklich immer, absolute Pfadangaben verwenden.

Im zweiten Teil zeige ich jetzt noch die saubere Lösung für Programmeinstellungen, die auch unter Vista und unter XP ohne Administratorrechte funktioniert.


Anwendungsverzeichnis Tests.zip  (237.33 KB) Download (Rev 0)
 (1185x, 1185x gesamt)
Beschreibung: Demo-Anwendung zu dem Problem


Zuletzt bearbeitet von jaenicke am So 15.02.09 20:11, insgesamt 12-mal bearbeitet
jaenicke Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 30.12.08 01:34 
Jetzt zum Problem mit fehlenden Schreibrechten unter c:\programme

Hier gibt es einen FAQ Beitrag von mir, der eine Lösung für das Speichern der Konfigurationseinstellungen eines Programms zeigt und dies gleichzeitig vereinfacht:
www.delphi-library.d...ewtopic.php?p=541637

Das Problem ist:
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?
Dies beantworte ich in diesem Beitrag:
www.delphi-library.d...ewtopic.php?p=548600

Dies ist jetzt eine relativ kurze Übersicht zu dem Thema, aber ich hoffe es steht alles wichtige drin, außerdem hoffe ich die Kürze animiert zum Lesen...

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

Schönen Gruß,
Sebastian Jänicke