Seite 1 von 4

Diskussion: Get ParentDirectory - (Mit nur einer Zeile)

Verfasst: 07.04.2010 22:59
von al90
Hi,

Hab gerade mal ein bischen Rumexperimentiert und dabei fiel mir ne Lösung ein die auch z.b. "C:\" berücksichtigt.
(Also ein Pfad OHNE SubFolder) Ausserdem kommt es mal ohne API aus. :)

Code: Alles auswählen

Procedure.s GetParentDirectory(Dir$)
  ProcedureReturn GetPathPart(Left(Dir$,Len(Dir$)-CountString(Dir$,"\")+1))
EndProcedure

Debug GetParentDirectory("C:\MainFolder\SubFolder_1\SubFolder_2\")
Debug GetParentDirectory("C:\MainFolder\SubFolder_1\")
Debug GetParentDirectory("C:\MainFolder\")
Debug GetParentDirectory("C:\")

Re: Get ParentDirectory - (Mit nur einer Zeile)

Verfasst: 07.04.2010 23:28
von STARGÅTE
Das trifft aber nur bei Absoluten Pfaden zu ...
Wenn ich mich irgendwo relativ befinde:
"Data\Sound\"
und lande ich beim ersten GetParentDirectory bei "Data\"
und ich würde nun sagen, dass ein weites GetParentDirectory dann ".\" zurück geben sollte.

Weil es hier gut passt, hier n Procedure zum ausgeben des "reihnen" Dateinamens, ohne Erweiterung:

Code: Alles auswählen

; Gibt den Dateinamen ohne Erweiterung zurück
Procedure.s GetNamePart(FullPathName$)
  If GetExtensionPart(FullPathName$)
    ProcedureReturn Left(GetFilePart(FullPathName$), Len(GetFilePart(FullPathName$))-Len(GetExtensionPart(FullPathName$))-1)
  Else
    ProcedureReturn GetFilePart(FullPathName$)
  EndIf
EndProcedure

Debug GetNamePart("C:\Programme\Virus.exe")
Debug GetNamePart("C:\Programme\Temp")
Debug GetNamePart("Programme\Version 1.2.4.ini")

Re: Get ParentDirectory - (Mit nur einer Zeile)

Verfasst: 08.04.2010 00:45
von al90
STARGÅTE hat geschrieben:Das trifft aber nur bei Absoluten Pfaden zu ...
Wenn ich mich irgendwo relativ befinde:
"Data\Sound\"
und lande ich beim ersten GetParentDirectory bei "Data\"
und ich würde nun sagen, dass ein weites GetParentDirectory dann ".\" zurück geben sollte.
Das war ja auch nur ein versuch das ganze in einer Zeile zu quetschen. Die Routine ist aber eh hinfällig,
da ich noch einen Bug gefunden habe, der offensichtlich nicht als Einzeiler zu beheben ist. So wird bspw:

C:\A\B\C\D\E\

nicht korrekt zurückgegeben. Naja zumindest habe ich jetzt einen Funktionierenden Vierzeiler daraus gemacht. :mrgreen:

Code: Alles auswählen

Procedure.s GetParentDirectory(Dir$)

  If Len(Dir$) > 3
    Dir$ = GetPathPart(Left(Dir$, Len(Dir$)-1))
  EndIf

  ProcedureReturn Dir$

EndProcedure

Debug GetParentDirectory("C:\MainFolder\SubFolder_1\SubFolder_2\")
Debug GetParentDirectory("C:\MainFolder\SubFolder_1\")
Debug GetParentDirectory("C:\MainFolder\")
Debug GetParentDirectory("C:\")
Debug GetParentDirectory("C:\a\b\c\d\e\") ; <--- Das geht jetzt also auch.

Re: Get ParentDirectory - (Mit nur einer Zeile)

Verfasst: 08.04.2010 01:24
von ts-soft
Netzwerkpfade gehen auch, aber Dateien werden als Ordner behandelt :wink:

Code: Alles auswählen

Procedure.s GetParentDirectory(Dir$)

  If Len(Dir$) > 3
    Dir$ = GetPathPart(Left(Dir$, Len(Dir$)-1))
  EndIf

  ProcedureReturn Dir$

EndProcedure

Debug GetParentDirectory("\\UBUNTU_DESKTOP\pb-ubuntu32\")
Debug GetParentDirectory("d:\ts-temp\simpsons_006.jpg")

Re: Get ParentDirectory - (Mit nur einer Zeile)

Verfasst: 08.04.2010 02:32
von al90
ts-soft hat geschrieben:Netzwerkpfade gehen auch, aber Dateien werden als Ordner behandelt :wink:
Dann vielleicht so ? :wink:

Code: Alles auswählen

Procedure.s GetParentDirectory(Dir$)

  If Len(Dir$) > 3
    Dir$ = GetPathPart(GetPathPart(Left(Dir$, Len(Dir$)-1)))
  EndIf

  ProcedureReturn Dir$

EndProcedure

Debug GetParentDirectory("\\UBUNTU_DESKTOP\pb-ubuntu32\")
Debug GetParentDirectory("d:\ts-temp\simpsons_006.jpg")
Edit:

Hatte es nicht getestet. Klappt scheinbar nicht. Das verstehe wer will. :roll:

Re: Get ParentDirectory - (Mit nur einer Zeile)

Verfasst: 08.04.2010 02:38
von ts-soft
al90 hat geschrieben:Dann vielleicht so ? :wink:
nein,

Code: Alles auswählen

Debug GetParentDirectory("d:\ts-temp\simpsons_006.jpg")
sollte d:\ ergeben,
so ist es ja nicht das Unterverzeichnis :wink:

Re: Get ParentDirectory - (Mit nur einer Zeile)

Verfasst: 08.04.2010 02:42
von salbei
Nach einer knappen Stunde Arbeit kam folgende Codezeile heraus:

Code: Alles auswählen

Procedure.s GetParentDirectory(Dir$, Seperator$ = "\", Protocol$ = "")
  ProcedureReturn Protocol$ + Left(RemoveString(Dir$, Protocol$), Len(RemoveString(RemoveString(Dir$, Protocol$), Seperator$, #PB_Ignore, Len(RemoveString(Dir$, Protocol$)))) - FindString(ReverseString(RemoveString(RemoveString(Dir$, Protocol$), Seperator$, #PB_Ignore, Len(RemoveString(Dir$, Protocol$)))), Seperator$, 1)) + Seperator$
EndProcedure


Debug GetParentDirectory("C:\MainFolder\SubFolder_1\SubFolder_2\")
Debug GetParentDirectory("C:\MainFolder\SubFolder_1\")
Debug GetParentDirectory("C:\MainFolder\")
Debug GetParentDirectory("C:\")
Debug GetParentDirectory("C:\a\b\c\d\e")
Debug GetParentDirectory("\c\d\e")
Debug GetParentDirectory("c\d\e")
Debug GetParentDirectory(".\c\d\e")
Debug GetParentDirectory("./c/d/e", "/")
Debug GetParentDirectory("./c\d/e", "/")
Debug GetParentDirectory("./c\d\e", "/")
Debug GetParentDirectory("./c/d\e", "/")
Debug GetParentDirectory("\\UBUNTU_DESKTOP\pb-ubuntu32\")
Debug GetParentDirectory("d:\ts-temp\simpsons_006.jpg")
Debug GetParentDirectory("d:\ts-temp\test\testy\simpsons_006.jpg")
Debug GetParentDirectory("google.de/index.php", "/")
Debug GetParentDirectory("google.de/test/index.php", "/")
Debug GetParentDirectory("google.de/test/test2/index.php", "/")
Debug GetParentDirectory("http://www.google.de/test/test2/index.php", "/", "http://")
Debug GetParentDirectory("ftp://www.google.de/test/test2/index.php", "/", "ftp://")
Debug GetParentDirectory("ftp://www.google.de/", "/", "ftp://")
Debug GetParentDirectory("ftp://www.google.de/test", "/", "ftp://")
Debug GetParentDirectory("ftp://www.google.de/test/test2/", "/", "ftp://")
Debug-Ausgabe:

Code: Alles auswählen

C:\MainFolder\SubFolder_1\
C:\MainFolder\
C:\
C:\
C:\a\b\c\d\
\c\d\
c\d\
.\c\d\
./c/d/
./c\d/
./
./c/
\\UBUNTU_DESKTOP\
d:\ts-temp\
d:\ts-temp\test\testy\
google.de/
google.de/test/
google.de/test/test2/
http://www.google.de/test/test2/
ftp://www.google.de/test/test2/
ftp://www.google.de/
ftp://www.google.de/
ftp://www.google.de/test/
Verdammt ist der Code geil :D
Wenn den jemand noch verkürzen mag, nur zu, Bedingung ist eine einzige Zeile ;-)
Vielleicht kann hier jemand den Code-Tag fixen, der Zeilenumbruch kommt unerwartet :mrgreen:

Edit:
Da es hier wirklich nur darum geht, den Parentfolder herauszufinden, ist es Aufgabe des Nutzers, als String einen Pfad anzugeben. Man erhält wirklich nur den übergeordneten Ordner, aus Sicht einer Datei ist der Parentfolder also der Ordner, in dem die Datei selbst liegt. Möchte man den übergeordneten Ordner eines Ordners, in dem die Datei liegt, so sollte man die Funktion einfach rekursiv aufrufen.

Re: Get ParentDirectory - (Mit nur einer Zeile)

Verfasst: 08.04.2010 02:43
von al90
ts-soft hat geschrieben:nein,

Code: Alles auswählen

Debug GetParentDirectory("d:\ts-temp\simpsons_006.jpg")
sollte d:\ ergeben,
so ist es ja nicht das Unterverzeichnis :wink:
Sorry war ich wohl zu langsam mit dem Edit. s.o. :wink:

Re: Get ParentDirectory - (Mit nur einer Zeile)

Verfasst: 08.04.2010 02:52
von ts-soft
@salbei
5 - 12 oder so ähnlich haben falsche Ergebnisse. Die ersten und die letzten scheinen zu stimmen.
Der Logik werde ich lieber nicht folgen, um diese Uhrzeit :mrgreen:

Re: Get ParentDirectory - (Mit nur einer Zeile)

Verfasst: 08.04.2010 02:52
von al90
salbei hat geschrieben:Nach einer knappen Stunde Arbeit kam folgende Codezeile heraus:
Oh man und ich dachte immer ich mache zu komplexe zeilen. :lol:
Aber auch dein Code scheint nicht 100% zu funzen.

C:\a\b\c\d\e

ergibt

C:\a\b\c\