Diskussion: Get ParentDirectory - (Mit nur einer Zeile)

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
al90
Beiträge: 1103
Registriert: 06.01.2005 23:15
Kontaktdaten:

Diskussion: Get ParentDirectory - (Mit nur einer Zeile)

Beitrag 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:\")
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Get ParentDirectory - (Mit nur einer Zeile)

Beitrag 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")
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
al90
Beiträge: 1103
Registriert: 06.01.2005 23:15
Kontaktdaten:

Re: Get ParentDirectory - (Mit nur einer Zeile)

Beitrag 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.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Get ParentDirectory - (Mit nur einer Zeile)

Beitrag 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")
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
al90
Beiträge: 1103
Registriert: 06.01.2005 23:15
Kontaktdaten:

Re: Get ParentDirectory - (Mit nur einer Zeile)

Beitrag 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:
Zuletzt geändert von al90 am 08.04.2010 02:40, insgesamt 1-mal geändert.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Get ParentDirectory - (Mit nur einer Zeile)

Beitrag 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:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
salbei
Beiträge: 6
Registriert: 08.04.2010 02:15

Re: Get ParentDirectory - (Mit nur einer Zeile)

Beitrag 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.
Zuletzt geändert von salbei am 08.04.2010 02:58, insgesamt 1-mal geändert.
Benutzeravatar
al90
Beiträge: 1103
Registriert: 06.01.2005 23:15
Kontaktdaten:

Re: Get ParentDirectory - (Mit nur einer Zeile)

Beitrag 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:
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Get ParentDirectory - (Mit nur einer Zeile)

Beitrag 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:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
al90
Beiträge: 1103
Registriert: 06.01.2005 23:15
Kontaktdaten:

Re: Get ParentDirectory - (Mit nur einer Zeile)

Beitrag 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\
Antworten