![]() |
Delphi-Version: 10.4 Sydney
ExpandFileName gibt "falsches" Ergebnis aus
Hallo Zusammen,
die Funktion ExpandFileName gibt ein unerwartetes Ergebnis aus, welches ich nicht verstehe. Ich habe in dem Ordner, in welcher die Exe-Datei liegt weitere Ordner, unter anderem den Ordner RES. Aus diesem Ordner soll eine Datei geladen werden, die auch vorhanden ist. Pfad der Exe-Datei
Code:
Jetzt möchte ich folgende Datei laden:
'D:\Software_Entwicklung\VersandApp\VersandApp\BD_VersandClient\Win32\Debug\BD_DHL.exe'
Code:
Dazu verwende ich die ExpandFileName Funktion:
'D:\Software_Entwicklung\VersandApp\VersandApp\BD_VersandClient\Win32\Debug\Res\PDF_View.fr3'
Delphi-Quellcode:
Report.LoadFromFile(ExpandFileName('.\Res\PDF_View.fr3'));
Und dann gibt ExpandFileName den Pfad
Code:
aus. Diesen Pfad gibt es gar nicht, den im Ordner D:\XML gibt es keine weiteren Unterordner...
'D:\XML\Res\PDF_View.fr3'
Ich hatte diesen Pfad erwartet:
Code:
Habe ich die Funktion falsch verstanden - ich verwende sie öfters, ohne je Probleme gehabt zu haben... :oops:
'D:\Software_Entwicklung\VersandApp\VersandApp\BD_VersandClient\Win32\Debug\Res\PDF_View.fr3'
NACHTRAG: Es ist verrückt, aber ich arbeite gerade an einer Client Server App. Das Problem, dass ich hier beschrieben habe, entsteht in der ClientApp. Ich hatte in der Liste der überwachten Ausdrücke einen Ausdruck ExpandFileName('./Res/PDF_View.fr3'), also hardgecodet und nicht mit Variablenamen. Und in der ServerApp gibt er den richtigen Wert zurück:
Code:
Den Ordner gibt es in der ServerApp nicht, sondern nur in der ClientApp, aber der Pfadaufbau ist der richtige.
'D:\Software_Entwicklung\VersandApp\VersandApp\BD_VersandServer\Win32\Debug\Res\PDF_View.fr3'
Beide Funktionen greifen auf die System.SYSUtils zu, also da gibt es keinen Unterschied... Ich bin verwirrt.... Vielen Dank Patrick |
AW: ExpandFileName gibt "falsches" Ergebnis aus
Das Ding müsste vom "aktuellen Arbeitsverzeichnis" ausgehn (jeweils für den aktuellen Thread).
Meistens Oft das Verzeichnis der EXE, außer man startet die EXE nicht von ihrem Verzeichnis aus, oder man wechselt es ... PS: rate mal, was der böse Datei-Öffnen/Speichern-Dialog standardmäßig macht. Fazit: vorher in das Verzeichnis wechseln. ![]() ![]() ![]() ![]() Falls du Angst hast, dass irgendwo was bei kaputt geht ...
Delphi-Quellcode:
var CurPath := TDirectory.GetCurrentDirectory;
TDirectory.SetCurrentDirectory(TPath.GetLibraryPath); //TDirectory.SetCurrentDirectory(TPath.GetDirectoryName(Application.ExeName)); deinGewünschterPfad := TPath.GetFullPath('.\Res\PDF_View.fr3'); TDirectory.SetCurrentDirectory(CurPath); Ich hätte dir noch eine Alternative anbieten wollen, aber die ist "kaputt" und es wird sie auch nie geben. ![]() [edit] Ups, falscher Link. ![]() Und dort erwähnte GetFullPath macht das Gleiche, wie ExpandFileName, nur noch schlimmer. |
AW: ExpandFileName gibt "falsches" Ergebnis aus
Da gehe ich Mal davon aus, dass dein aktuelles Arbeitsverzeichnis (GetCurrrentDir) "D:\XML" ist ...
|
AW: ExpandFileName gibt "falsches" Ergebnis aus
Das ist gar nicht verwunderlich, denn
Zitat:
|
AW: ExpandFileName gibt "falsches" Ergebnis aus
Hallo Zusammen,
vielen Dank für Eure Antworten! Der Fehler tritt beim Debuggen auf. Ich habe die Client und die Server App in einer Projektgruppe. Wenn ich in der Server App GetCurrentDir im Haltepunkt abfrage ist das Ergebnis: 'D:\Software_Entwicklung\VersandApp\VersandApp\BD_ VersandServer\Win32\Debug' "KORREKT" Wenn ich GetCurrentDir in der Client App (auch beim debuggen) abfrage ist das Ergebnis: 'D:\XML' "FALSCH" Wovon hängt denn das "aktuelle Arbeitsverzeichnis" ab? Und worauf bezieht sich das Arbeitsverzeichnis. Es kann ja nicht der Rechner sein, denn beide Apps werden in der gleichen Delphi-Sesson gerade gedebugged... NACHTRAG: ich habe eine Idee: Ich habe in der ClientApp tatsächlich einen OpenDialog, der sich auf dieses Verzeichnis bezieht. Kann es sein, dass dadurch CurrentDir gesetzt wird. Dann würde ich die Funktion lieber nicht mehr verwenden wollen, man weiß ja nie, ob irgendwann ein solcher Dialog ins Programm kommt. Verwendet Ihr die Funktion? und wenn ja, wie? LG Patrick |
AW: ExpandFileName gibt "falsches" Ergebnis aus
Hi,
Ich würde mir das exe Verzeichnis holen und darauf aufbauend den Pfad erzeugen. Das mit dem ExpandFileName ist mehr oder weniger ein Glücksspiel. Nach meinem Verständnis würden solche Daten auch eher in andere Verzeichnisse (Dokumente, App Data o.ä. ) gehören, gerade auch weil windows immer strenger über die Programmverzeichnisse wacht. |
AW: ExpandFileName gibt "falsches" Ergebnis aus
Vielen Dank für die Hilfe und Erklärungen!
Ich habe es jetzt so gelöst, wie himitsu es eigentlich schon erklärt - ich nur übersehen hatte...
Delphi-Quellcode:
Damit funktioniert es.
SetCurrentDir(ExtractFilePath(Application.Exename));
Report.LoadFromFile(ExpandFileName(Report_Path)); Aber richtig toll finde ich es nicht und überlege mir, die Pfade tatsächlich auf dem Programmpfad aufbauend zu gestalten. Nur muss ich dann das "\" am Ende überprüfen und ich kann nicht den gleichen Code verwenden, wenn in der Config-Datei mal ein Pfad \\Server\Ordner\Datei.igw und manchmal .\Ordner\Datei.igw angegeben wird... Das wäre mit ExpandFileName so schön einfach gewesen... LG Patrick |
AW: ExpandFileName gibt "falsches" Ergebnis aus
Wie gesagt, der FileDialog macht es standardmäßig gern.
Kann man (oftmals) deaktivieren, indem man in dessen Optionen den Filetest deaktiviert .... aber sicher ist das nicht. Und es kann durch vieles passieren. z.B. wie und von du das Programm startest. * siehe Delphi -> Start -> Parameter (Arbeitsverzeichnis) * oder bei einem Link im Windows (siehe "Ausführen in") * oder aus einer Batch CMD:
Code:
versus
cd /d D:\XML
D:\Software_Entwicklung\VersandApp\VersandApp\BD_VersandClient\Win32\Debug\BD_DHL.exe cd /d D:\Software_Entwicklung\VersandApp\VersandApp\BD_VersandClient Win32\Debug\BD_DHL.exe .\Win32\Debug\BD_DHL.exe
Code:
cd /d D:\Software_Entwicklung\VersandApp\VersandApp\BD_VersandClient\Win32\Debug
BD_DHL.exe cd /d D:\Software_Entwicklung\VersandApp\VersandApp\BD_VersandClient\Win32\Debug D:\Software_Entwicklung\VersandApp\VersandApp\BD_VersandClient\Win32\Debug\BD_DHL.exe oder oder oder Du weißt z.B. auch nie, was eine Fremdkomponente in deinem Programm jetzt/irgendwann macht. z.B. Acrobat via ActiveX in der eigenen Anwendung ... sowas ergibt immer wieder sehr viel Spaß :lol: Darum wird auch immer wieder von abgeraten, dass man mit relativen Pfaden arbeitet. Und genau genommen nutzt du hier einen relativen Pfad, abhängig ausgehend von dem "zufälligen" Arbeitsverzeichnis. |
AW: ExpandFileName gibt "falsches" Ergebnis aus
Zitat:
![]() ![]() |
AW: ExpandFileName gibt "falsches" Ergebnis aus
Vielen Dank,
IncludeTrailingPathDelimiter vereinfact das sehr, ersetzt aber nicht die schöne Funktion ExpandFileName. Wäre cool, wenn man ExpandFileName einen optionalen Parameter mit dem Start-Verzeichnis mitgeben könnte. Standardmäßig das Arbeitsverzeichnis, oder ein Beliebiges, wie ExtractFilePath(ParamStr(0)), dann wäre sie sicher einsetzbar... ExpandFileName(relativePfadVariable, ExtractFilePath(ParamStr(0))); Spinnerei... :wink: Vielen Dank und lieben Gruß - ich habe wieder etwas gelernt. Patrick |
AW: ExpandFileName gibt "falsches" Ergebnis aus
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:48 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz