Seite 1 von 2
Tatsächlichen Dateipfad berechnen
Verfasst: 17.02.2010 16:09
von WPö
Servus, Leute!
Heute stehe ich wohl wieder einmal auf der Leitung.
Ich brauche eine Funktion, die mir zu einem zusammengestückelten Pfad wie
D:\abc\def\..\ghi\Datei
den effektiven Pfad zurückgibt, also
D:\abc\ghi\Datei
Offensichtlich lese ich in der PB-Hilfe jedesmal über den richtigen Befehl drüber - oder gibt es ihn nicht? Deshalb auch im Anfänger-Bereich

. Unter PHP ist es realpath().
Danke für die Antworten!
Gruß - WPö
Re: Tatsächlichen Dateipfad berechnen
Verfasst: 17.02.2010 16:57
von Andesdaf
eine in PureBasic integrierte Funktion gibts dafür nicht.
Um das zeuch zu verkürzen gibt's
PathCompactPath.
Keine Ahnung, vielleicht gibt's noch einen weiteren Befehl.
Re: Tatsächlichen Dateipfad berechnen
Verfasst: 17.02.2010 16:57
von STARGÅTE
wenns nur "das" ist sollte n Regulärer Ausdruck helfen:
Code: Alles auswählen
Global RealPathExpression = CreateRegularExpression(#PB_Any, "[^\\]+\\\.\.\\|\.\\")
Procedure.s RealPath(Path$)
ProcedureReturn ReplaceRegularExpression(RealPathExpression, Path$, "")
EndProcedure
Debug RealPath("D:\abc\.\def\..\ghi\Datei")
Er sucht nach rücksprüngen "..\", oder gleichen Ebenen ".\"
und löscht diese, mit den unterebenen.
Re: Tatsächlichen Dateipfad berechnen
Verfasst: 17.02.2010 17:22
von WPö
Danke Euch beiden!
Hab nochmal versucht, ohne Umwandlung solche Dateipfade an OpenFile und ReadFile zu übergeben und:
Du kriegst die Tür nicht zu!
Das funktioniert!
Ist also unnötig, RealPath nachzuprogrammieren - zumindest in dem Umfang, den ich hier verwendet habe. Trotzdem speziell Dir, Stargate, nochmals ein heftiges Danke!
Wie bei diesen RegEx üblich, sieht das richtig schlimm aus.
Gruß - WPö
Re: Tatsächlichen Dateipfad berechnen
Verfasst: 17.02.2010 17:39
von Little John
WPo hat geschrieben:Unter PHP ist es realpath().
Ich denke GetFullPathName_() macht das gleiche:
Code: Alles auswählen
Procedure.s FullName (source.s)
; in: short or long file name
Protected ret.s{#MAX_PATH}
GetFullPathName_(@source, #MAX_PATH, @ret, #Null)
ProcedureReturn ret
EndProcedure
;-- Demo
Debug FullName("C:\Windows\..")
Gruß, Little John
Re: Tatsächlichen Dateipfad berechnen
Verfasst: 17.02.2010 18:23
von #NULL
STARGÅTE hat geschrieben:wenns nur "das" ist sollte n Regulärer Ausdruck helfen:
Code: Alles auswählen
Global RealPathExpression = CreateRegularExpression(#PB_Any, "[^\\]+\\\.\.\\|\.\\")
Procedure.s RealPath(Path$)
ProcedureReturn ReplaceRegularExpression(RealPathExpression, Path$, "")
EndProcedure
Debug RealPath("D:\abc\.\def\..\ghi\Datei")
Er sucht nach rücksprüngen "..\", oder gleichen Ebenen ".\"
und löscht diese, mit den unterebenen.
klappt noch nicht ganz bei mehrfachen doppeldingens:
Re: Tatsächlichen Dateipfad berechnen
Verfasst: 17.02.2010 18:45
von STARGÅTE
jo, war auch nur auf die schnelle hin"geschmiert" ...
das Suchmuster muss noch präzisiert werden.
Re: Tatsächlichen Dateipfad berechnen
Verfasst: 17.02.2010 21:19
von AND51
Falls möglich, das Arbeitsverzeichnis kurz auf den Pfad setzen und wieder zurücksetzen:
Code: Alles auswählen
Procedure.s GetRealPath(Path$)
Protected currentDir.s=GetCurrentDirectory() ; aktuellen Pfad speichern
SetCurrentDirectory(Path$)
Protected realPath.s=GetCurrentDirectory()
SetCurrentDirectory(currentDir) ; altes aktuellen Pfad wiederherstellen
ProcedureReturn realPath
EndProcedure
Debug GetRealPath("C:\Windows\system32\..\..\Windows\") ; should debug "C:\Windows"
Re: Tatsächlichen Dateipfad berechnen
Verfasst: 17.02.2010 22:08
von Little John
AND51 hat geschrieben:Falls möglich, das Arbeitsverzeichnis kurz auf den Pfad setzen und wieder zurücksetzen
Und warum so umständlich?
Re: Tatsächlichen Dateipfad berechnen
Verfasst: 17.02.2010 22:19
von ts-soft
Little John hat geschrieben:Und warum so umständlich?
Wie sollte man das aktuelle Arbeitsverzeichnis sonst sichern und wiederherstellen?