Arbeitsverzeichnis richtig setzen?

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Epcop
Beiträge: 173
Registriert: Di 29. Mai 2012, 09:36

Arbeitsverzeichnis richtig setzen?

Beitrag von Epcop »

Hallo,

ich bin verwirrt.

Ich setze im OnCreate das Arbeitsverzeichnis:

SetCurrentDir(ExtractFilePath(ParamStr(0)));

Und erwarte, dass in meinen Programm neue Textdateien usw. dann auch in dem Verzeichnis landen, indem die ausführbare Datei ist z.B.:
datei : TSTringlist
[...]
datei.savetoFile('./datei.txt');
[...]

Trotzdem landen Dateien gelegentlich im /Home Verzeichnis. Meistens landen sie in dem Verzeichnis der ausführbaren Datei. Dateien im /Home scheinen zusätzlich zu sein, ich bekomme keinen Datenverlust. Aber ich kann es auch nicht richtig reproduzieren. Es fällt mir nur hin und wieder zufällig auf, dass im Home Verzeichnis Dateien herumliegen, die da nicht hingehören (leere Dateien. Gespeichert wurde richtig im Programmverzeichnis).

Aber warum ist das so??

Wie verhält es sich so? (Theoretisch doch auch im Programmverzeichnis?)

datei.savetoFile('datei.txt');

Oder bei Programm Verknüpfungen? Das sollte ja mit setzen des Arbeitsverzeichnises aber keine Rolle spielen?!
Muss ich das Arbeitsverzeichnis auf jeder Form neu setzen?!

LG
Epcop

Linux

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

Re: Arbeitsverzeichnis richtig setzen?

Beitrag von theo »

Schwer zu sagen, wenn du es nicht reproduzieren kannst.

Warum nicht einfach mit vollständigem Pfad probieren?

Code: Alles auswählen

SL.SaveToFile(Application.Location+'datei.txt');
Für Konfigurationsdateien auch gerne GetAppConfigDir.
https://www.freepascal.org/docs-html/rt ... igdir.html

Warf
Beiträge: 2325
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Arbeitsverzeichnis richtig setzen?

Beitrag von Warf »

Naja die erste ganz doofe Frage, was ist denn der Rückgabewert von SetCurrentDir? Die Funktion müsste True zurück geben wenn es geklappt hat, wenn nicht dann ist ein Fehler aufgetreten (vermutlich steht in errno dann mehr). Alternativ probier mal ChDir aus der System Unit, oder aus der Unit BaseUnix fpchdir, das ist die POSIX Systemfunktion.

Der Tatsächlich sauberste weg ist aber gar keine Annahmen über das Arbeitsverzeichnis zu treffen und stattdessen einfach den Pfad korrekt zu bauen. z.B. mit einer Hilfsfunktion:

Code: Alles auswählen

function LocalPath(const APath: String): String; inline;
begin
  Result := ConcatPaths([ExtractFilePath(ParamStr(0)), APath);
end;

Antworten