Smarte Methode zum Dateipfad kürzen gesucht

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Smarte Methode zum Dateipfad kürzen gesucht

Beitrag von mk-soft »

So geht es mit allen OS automatisch...

Code: Alles auswählen

Procedure.s GetParentPath(sPath.s, iLevelsUp.i = 1, sSeparator.s = "")
  Protected i.i
  ReplaceString(sPath, #NPS$, #PS$, #PB_String_InPlace)
  For i = 1 To iLevelsUp
    sPath = GetPathPart(RTrim(sPath, #PS$))
  Next
  If sSeparator
    ReplaceString(sPath, #PS$, sSeparator, #PB_String_InPlace)
  EndIf  
  ProcedureReturn sPath
EndProcedure

Debug GetParentPath("D:\1/Obst\Äpfel\Reife\Greenstar")
Debug GetParentPath("D:\1/Obst\Äpfel\Reife/Greenstar/")
Debug GetParentPath("D:\1/Obst\Äpfel\Reife\Greenstar\")
Debug GetParentPath("D:\2\Obst/Äpfel\Reife/Greenstar",2)
Debug GetParentPath("D:/2/Obst/Äpfel/Reife\Greenstar/",2)
Debug GetParentPath("D:/2/Obst/Äpfel/Reife/Greenstar\",2)
Debug GetParentPath("D:\3\Obst/Äpfel\Reife/Greenstar", 3)
Debug GetParentPath("D:\3\Obst/Äpfel\Reife\Greenstar/", 3)
Debug GetParentPath("D:\4\Obst\Äpfel\Reife\Greenstar\", 3)

Debug GetParentPath("D:\0/Obst\Äpfel\Reife\Greenstar", 0, #NPS$)
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Smarte Methode zum Dateipfad kürzen gesucht

Beitrag von Nino »

Kurzer hat geschrieben:Debug ReplaceString("Hallo Welt", "Welt", "Mond", #PB_String_InPlace) ; Gibt ebenfalls 'Eiscreme mit Brombeersauce' aus!
Genau auf diese Weise soll ReplaceString() in Verbindung mit dem Parameter #PB_String_InPlace eben NICHT verwendet werden. Du hast in deinem vorangegangenen Posting doch selbst die betr. Passage aus der Hilfe zitiert!

'InPlace' bedeutet, dass der übergebene String selbst verändert wird. Das funktioniert natürlich nur mit einer Variablen, nicht mit einer Konstanten. So geht's:

Code: Alles auswählen

Procedure.s ReturnString()
   Protected sText.s
   sText = "Eiscreme mit Erdbeersauce"
   sText = ReplaceString(sText, "Erd", "Brom")
   ProcedureReturn sText
EndProcedure

Debug ReturnString() ; Gibt 'Eiscreme mit Brombeersauce' aus
text$ = "Hallo Welt"
ReplaceString(text$, "Welt", "Mond", #PB_String_InPlace)
Debug text$                                               ; Gibt 'Hallo Mond' aus
Debug ReplaceString("Hallo Welt", "Welt", "Mond")         ; Gibt 'Hallo Mond' aus
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Smarte Methode zum Dateipfad kürzen gesucht

Beitrag von Nino »

Kurzer hat geschrieben:Ich habe mich nun für diese Lösung entschieden die optional auch die Pfadseparatoren korrigert.
Gute Idee!

Das macht Spaß hier ... die Funktion GetParentPath() durchläuft in kurzer Zeit einen regelrechten evolutionären Prozess. :-)

@mk-soft: :allright:
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: Smarte Methode zum Dateipfad kürzen gesucht

Beitrag von Kurzer »

Nino hat geschrieben:Genau auf diese Weise soll ReplaceString() in Verbindung mit dem Parameter #PB_String_InPlace eben NICHT verwendet werden. Du hast in deinem vorangegangenen Posting doch selbst die betr. Passage aus der Hilfe zitiert!
Ja das weiß ich doch, dass man ihn so nicht einsetzen soll und dass bei #PB_String_InPlace der Originalstring direkt im Speicher überschrieben wird. :wink:
Ich wollte nur darauf hinweisen, dass die Rückgabe in diesem Fall eben nicht so ist, wie in der Hilfe beschrieben steht (ganz unabhängig davon, dass man diese Rückgabe nicht benutzen soll).

In der Hilfe steht, dass die Rückgabe von ReplaceString() bei Verwendung von #PB_String_InPlace genau dem Eingangsstring entspricht in dem inplace-Ersetzung stattfinden soll. In Wirklichkeit wird aber ein Stringbuffer zurückgegeben der überhaupt nichts mit der aktuellen Codezeile zu tun hat.

Statt "Hallo Welt" kommt "Eiscreme mit Brombeersauce" zurück. Das fand ich halt bemerkenswert. Insofern ist die HIlfe also nicht ganz korrekt.

@mk-soft: Wo nimmst du nur diese geilen Konstanten her? :allright: #NPS$ steht gar nicht in der Konstantenliste der PB Hilfe. Wieder was gelernt. :D
Allerdings führt deine Zeile ReplaceString(sPath, #NPS$, #PS$, #PB_String_InPlace) am Anfang dazu, dass der Separator immer korrigiert wird, auch wenn der Parameter gar nicht angegeben wird (siehe z.B. zweite Debugzeile).
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.12 x64, OS: Win 11 24H2 x64, Desktopscaling: 150%, CPU: I7 12700 H, RAM: 32 GB, GPU: Intel(R) Iris(R) Xe Graphics | NVIDIA GeForce RTX 3070
Useralter in 2025: 57 Jahre.
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Smarte Methode zum Dateipfad kürzen gesucht

Beitrag von Nino »

Kurzer hat geschrieben:In der Hilfe steht, dass die Rückgabe von ReplaceString() bei Verwendung von #PB_String_InPlace genau dem Eingangsstring entspricht in dem inplace-Ersetzung stattfinden soll.
Wo steht das :?:

Hier ist die komplette Erklärung aus der Hilfe (PB 5.71) zu '#PB_String_InPlace':

Code: Alles auswählen

#PB_String_InPlace       : "In place" (an Ort und Stelle) ersetzen. Dies bedeutet, dass der String direkt
                           im Speicher ersetzt wird. Der 'SuchString$' und der 'ErsatzString$' müssen die
                           gleiche Länge haben! Dies ist eine gefährliche Option, nur für fortgeschrittene
                           Anwender. Der Vorteil ist die sehr hohe Geschwindigkeit beim Ersetzen. Wenn diese
                           Option verwendet wird, muss das Ergebnis von ReplaceString() ignoriert werden
                           (und auch nirgends zugewiesen - da es der als Parameter übergebene 'String$' ist,
                           der geändert wird).
Über den Rückgabewert von ReplaceString() steht dort nur, dass er ignoriert werden soll, sonst nichts.

PS: Zu den Konstanten siehe in der Hilfe: Geschichte, Version 5.70 LTS
- Hinzugefügt: #PS, #NPS, #PS$ and #NPS$ Konstanten (Pfadtrennzeichen abhängig vom Betriebssystem)
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: Smarte Methode zum Dateipfad kürzen gesucht

Beitrag von Kurzer »

Nino hat geschrieben:Wo steht das :?:
Hier steht es:
Bild


Bzgl. der Konstanten: Ah okay, die müssten dann wohl noch in die PB Konstantenliste aufgenommen werden.
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.12 x64, OS: Win 11 24H2 x64, Desktopscaling: 150%, CPU: I7 12700 H, RAM: 32 GB, GPU: Intel(R) Iris(R) Xe Graphics | NVIDIA GeForce RTX 3070
Useralter in 2025: 57 Jahre.
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Smarte Methode zum Dateipfad kürzen gesucht

Beitrag von Nino »

Kurzer hat geschrieben:
Nino hat geschrieben:Wo steht das :?:
Hier steht es:
Bild
:?: :?: :?:

Da steht einiges, aber sicher nicht
dass die Rückgabe von ReplaceString() bei Verwendung von #PB_String_InPlace genau dem Eingangsstring entspricht in dem inplace-Ersetzung stattfinden soll.
An der 2. von dir hervorgehobenen Stelle steht, dass der als Parameter übergebene 'String$' geändert wird. Das hast du offenbar komplett falsch verstanden.

PS: Es handelt sich um eine Satzkonstruktion wie im folgenden Beispiel:
"Es ist Peter, der das Spiel gewonnen hat (und nicht etwa Fritz, wie jemand vorhin sagte)."
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: Smarte Methode zum Dateipfad kürzen gesucht

Beitrag von Kurzer »

PS: Es handelt sich um eine Satzkonstruktion wie im folgenden Beispiel:
"Es ist Peter, der das Spiel gewonnen hat (und nicht etwa Fritz, wie jemand vorhin sagte)."
Also ich habe weder Linguistik studiert, noch Germanistik, aber die Bezüge die in dem Satz existieren, sind meiner Meinung nach eindeutig.
Ich versuche es nochmal dazustellen indem ich den Satz umstelle, vereinfache und die Bezüge farblich markiere.
String$ = ReplaceString(String$, SuchString$, ErsatzString$ [, Modus [, StartPosition [, AnzVorkommen]]])

Wenn diese Option verwendet wird, muss das Ergebnis von ReplaceString() ignoriert werden (und auch
nirgends zugewiesen - da es der als Parameter übergebene 'String$' ist, der geändert wird).


Wenn diese Option verwendet wird, muss das Ergebnis von ReplaceString() ignoriert werden
(und auch nirgends zugewiesen (werden) - da das Ergebnis der als Parameter übergebene 'String$' ist, der geändert wird).


Wenn diese Option verwendet wird, muss das Ergebnis von ReplaceString() ignoriert werden,
da das Ergebnis der übergebene 'String$' ist.


Wenn diese Option verwendet wird, muss das Ergebnis von ReplaceString() ignoriert werden,
da das zurückgegebene Ergebnis der übergebene 'String$' ist.
Ich sehe nicht, dass da ein neuer Bezug (Fritz) eingeführt wird. Hier ist immer nur die Rede von dem Ergebnis (Peter).

Gruß Kurzer
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.12 x64, OS: Win 11 24H2 x64, Desktopscaling: 150%, CPU: I7 12700 H, RAM: 32 GB, GPU: Intel(R) Iris(R) Xe Graphics | NVIDIA GeForce RTX 3070
Useralter in 2025: 57 Jahre.
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Smarte Methode zum Dateipfad kürzen gesucht

Beitrag von Nino »

Kurzer hat geschrieben:Also ich habe weder Linguistik studiert, noch Germanistik, ...
Ich auch nicht, und das ist auch nicht nötig, um diesen Text richtig zu verstehen. Ausreichendes Sprachgefühl genügt völlig.
Kurzer hat geschrieben:Ich sehe nicht, dass da ein neuer Bezug (Fritz) eingeführt wird.
Es geht auch nicht um Fritz, deshalb habe ich diesen ergänzenden Teil extra in Klammern geschrieben in der Hoffnung, dass der Satz dadurch besser verständlich wird - offenbar vergebens. Die Satzkonstruktion, die ich zeigen wollte, wird auch ohne den Inhalt der Klammer deutlich.

Deine Interpretation des Textes ist völlig an den Haaren herbeigezogen und unsinnig. Da meine Erklärungen offenbar bei dir nicht ankommen, ist für mich diese Diskussion hier beendet.
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: Smarte Methode zum Dateipfad kürzen gesucht

Beitrag von Kurzer »

Nino hat geschrieben:...Da meine Erklärungen offenbar bei dir nicht ankommen, ist für mich diese Diskussion hier beendet.
Ich sehe auch, dass wir hier nicht auf einen Nenner kommen. Evtl. erbarmt sich mal jemand, der das wirklich gelernt hat und schreibt was dazu. Ich bin ja gerne bereit etwas neues zu lernen oder zu einem Fehler zu stehen - nur richtig begründet soll es dann auch sein.

Mich würde einfach nur noch interessieren auf was sich das Wort "es" deiner Meinung nach bezieht. Mir reicht es nicht, wenn man sagt, dass es nichts mit dem Ergebnis zu tun hat. Auf irgendwas muss es sich doch auch in deinem Satzverständnis beziehen, nur auf was?
Wenn diese Option verwendet wird, muss das Ergebnis von ReplaceString() ignoriert werden (und auch
nirgends zugewiesen - da es der als Parameter übergebene 'String$' ist, der geändert wird).
Gruß Kurzer

PS: Immerhin ist man im englischen Forum auch der Meinung, das diese Passage in der Hilfe nicht wirklich optimal formuliert ist. Auf mehr wollte ich damit auch nicht hinweisen.
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.12 x64, OS: Win 11 24H2 x64, Desktopscaling: 150%, CPU: I7 12700 H, RAM: 32 GB, GPU: Intel(R) Iris(R) Xe Graphics | NVIDIA GeForce RTX 3070
Useralter in 2025: 57 Jahre.
Antworten