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 :oops: . 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! :bounce:
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:

Code: Alles auswählen

Debug RealPath("D:\abc\.\def\..\..\ghi\Datei")

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?