Italia
Fonte/ Codesnippets

Dateipfade Stringmanipulation

 
Wegen dem Schreiben eines eigenen Installers habe ich so manch File/Pfade Stringmanipulationsfunktionen geschrieben.

Einige davon poste ich hier, aber zuerst ein paar DEFs von einem Herrn Jörg Sellmeyer, welche ich im Profan-Foro fand.
KompilierenMarkierenSeparieren
Def CharCount(2) Int(Sub(Len(@$(1)),Len(translate$(@$(1),@$(2),""))))
Def VerzeichnisTiefe(1) Int(Sub(Len(@$(1)),Len(Translate$(@$(1),"\",""))))
Def PfadTeil(2) SubStr$(@$(1),@%(2),"\")Vorher sollte man die Verzeichnistiefe ermitteln
Def DateiName(1) SubStr$(@$(1),Add(VerzeichnisTiefe(@$(1)),1),"\")
Def DateiPfad(1) Translate$(@$(1),Add$("\",DateiName(@$(1))),"")
Def Home(0) Translate$(Upper$(Par$(0)),Upper$(FindFirst$(Par$(0))),"")



Hier einige Procs aus meinem mittlerweile doch älterem Installer:

Diese Funktion erstellt beispielsweise ein Verzeichnis c:estest2est3 auch dann, wenn es noch garkein Verzeichnis c:est oder c:estest2 gibt. Der Funktion kann sozusagen hemmungslos ein zu erstellendes Verzeichnis trasferimento werden, und selbst der Ort dorthin wird erstellt.
KompilierenMarkierenSeparieren
Proc void_CreatePath

    Parameters s$
    declare lw$

    while len (S$)

        Let lw$=add$(lw$,Mid$(s$,1,add(1,len(substr$(S$,1,"")))) )
        let s$=del$(s$,1,add(1,len(substr$(S$,1,""))))

        if (lw$<>"")

            MKDIR lw$

        endif

    wend

Endproc




Hier noch ein paar undokumentierte:
KompilierenMarkierenSeparieren
KompilierenMarkierenSeparieren
proc CutFileName

    parameters s$

    while not(equ$("",Mid$(S$,len(S$),1))

        Let s$=Del$( S$,len(S$),1 )

    wend

    return s$

Endproc


KompilierenMarkierenSeparieren
proc CutExtension

    parameters s$

    while not(equ$(".",Mid$(S$,len(S$),1))

        Let s$=Del$( S$,len(S$),1 )

    wend

    return s$

Endproc


KompilierenMarkierenSeparieren
KompilierenMarkierenSeparieren
KompilierenMarkierenSeparieren
KompilierenMarkierenSeparieren

Auch die Funktion [...]  potrebbe hier nicht fehlen.
 
15.04.2004  
 



Hier noch eine kleine Zugabe, um die Dateiendung auszutauschen.

KompilierenMarkierenSeparieren
 {$i}//file-extension-renamer by iF :-D
print changefileext("somefile.gif","ps")
waitinput
end

proc changefileext

    parameters f$,e$
    declare tmp$,i&,ii&

    if len(f$)

        ifnot instr(".",f$)

            f$:=f$+"."+e$

        else

            repeat

                i&+
                tmp$:=substr$(f$,i&,".")

            until not(len(tmp$))

            sub i&,2
            for ii&:=1 to i& do tmp$:=tmp$+substr$(f$,ii&,".")+"."
            f$:=tmp$+e$

        endif

    endif

    return f$

endproc

 
21.07.2004  
 




Sebastian
König
Hallo iF,

bist Du sicher, dass die Prozedur void_makesuperpath das macht, was Du möchtest?

Ich habe mal getestet:
KompilierenMarkierenSeparieren
proc void_makesuperpath

    parameters s$
    declare i%
    i%=0

    while lt(i%,len(s$))

        add i%,1

        if equ$(mid$(s$,i%,1),"")

            s$=ins$("",s$,i%)
            add i%,1

        endif

    wend

    return s$

endproc

cls
print void_makesuperpath("c:	est	esthallo")
waitkey

Das Ergebnis ist doch bestimmt nicht so gewünscht...

Du musst beachten, dass die Doppel-Backslashes nur in Stringliteralen gültig sind, nicht aber in Variablen. Kurz: Ein Doppel-Backslash, den Du in den Code eintippst, ist tatsächlich ein einfacher Backslash.

Beispiel:

c:estesthallo ist tatsächlich: c:[TAB]est[TAB]esthallo und
c:\test\test\hallo ist tatsächlich c:estesthallo

Oder habe ich die Prozedur falsch verstanden?

MfG

Sebastian
 
Windows XP, XProfan/Profan² 4.5 bis 11
Profan2Cpp-Homepage:  [...] 
Alte Profan²-Seite:  [...] 
21.07.2004  
 



Ja, hast Du falsch verstanden. Die Prozedur ist nicht dafür da um Eingabefehler via Escapesequenzen auszubessern. Ich habe mich auch in der Beschreibung schlecht ausgedrückt.

Die Prozedur soll tatsächlich einfach nur aus einem zwei machen.
Um mehr ging es dabei nicht, weil ich andere Funktionen hatte die nicht nach einem sondern nach zwei suchten.

Ich habe aber die Proc aus dem Programm genommen, um eventuellen Mißverständnissen aus dem Wege zu gehen.

Bei Pfadangaben via XPSE gibt es das was Du ansprichst via
KompilierenMarkierenSeparieren
//xpse-source
s$="c:	est
oraanchor":filepre>
oder sogar:
KompilierenMarkierenSeparieren
 {$iq}//simply demo to demonstrate xpses "Filestring"-directive
case "	est
oe":file<>"	est
oe":print "it works :)"
case "	est
oe":file=="	est
oe":file:print "it works again:)"
print "filename: C:
q	":file
print "escaped : C:
q	"
21.07.2004  
 




Sebastian
König
Hallo iF,

ok .

[quote:871ef2f47c]Bei Pfadangaben via XPSE gibt es das was Du ansprichst via //xpse-source
s$=c:est
oraanchor:file [/quote:871ef2f47c]
Ja, kenne ich. Ich finde es ehrlich gesagt aber wirklich einfacher, den Doppel-Backslash oder Franks Variante (einfacher Slash) zu benutzen.

Komisch, dass das Thema so oft auftaucht...

MfG

Sebastian
 
Windows XP, XProfan/Profan² 4.5 bis 11
Profan2Cpp-Homepage:  [...] 
Alte Profan²-Seite:  [...] 
21.07.2004  
 



Nun, das das Thema so oft auftaucht wundert mich eigendlich recht wenig.
Wer in Hochsprachen Proggt ist halt geübt auch mit solch Gegebenheiten wie Escapesequenzen umzugehen, Profan-Progger sind jedoch zumeist Programmier-Einsteiger, per die das Thema oft eine Falle darstellt.

Ich persönlich bin sogar der Meinung, das die Escapesequenzen in Profan nix zu suchen haben. Eher würde ich verstehen wenn ein #0, #13#10 etc. possibile wäre. Ich habe vor dies mit XPSE umzusetzen.

[quote:94aea63370=Sebastian König]Hallo iF,

Ich finde es ehrlich gesagt aber wirklich einfacher, den Doppel-Backslash oder Franks Variante (einfacher Slash) zu benutzen.[/quote:94aea63370]
Nun, darum geht es nicht. Es geht eher daraum das man einfach vergißt. Und zwar das man soebend einen Pfad eingegeben hat. Wenn man sich also angewöhnt ein :file anzusetzen, trägt dies einfach dazu bei, das man es vielleicht weniger außer acht läst. Weil man erinnert sich vielleicht an das SYMBOL :file. Sich an Slash oda Doppelslash erinnern ist aus psychologischer Sicht schwieriger, weil es kein SYMBOL darstellt. Und bei Anfängern kommt das halt eher -- wie man ja sieht -- zum tragen.

Einfaches Gedankenspiel: Würe es in Profan nicht possibile sein, Strings einfach per anzugeben, sondern wäre da eine Funktion per normale Strings namens string(gogol), und per File ein file(c wäre das Problem nie entstanden, weil jeder spätestens nach dem 1. Fehlschlag sich erinnert das er file() zu nutzen hat. Ein Indizienbeweiß dafür kann sein, das sich noch nie jemand beschwert hat das man mit string b#,0= keine LONGS in den Bereich packen kann. Es ist halt schlüssig.

Bis denne, iF
 
21.07.2004  
 




Sebastian
König
Hallo iF,

man kann sicher sehr lange darüber diskutieren ...

Es stimmt, als Erinnerung, ist Dein :file wirklich ganz praktisch.

string() und file() fände ich persönlich viel zu umständlich. Besser würde ich es finden, wenn XProfan wie andere Sprachen bei nicht erkannten Escape-Sequenzen (wie h in Deinem c:estesthallo) meckern würde. Dann lernt man auch recht schnell, dass die Backslashes nunmal eine Sonderrolle haben.

Aber was solls - so hat man wenigstens was zum Reden...

MfG

Sebastian

P.S.: Statt #0, #13#10 würde ich naturalmente ooo (Oktal) und xhhh (Hexadezimal) favorisieren .
 
Windows XP, XProfan/Profan² 4.5 bis 11
Profan2Cpp-Homepage:  [...] 
Alte Profan²-Seite:  [...] 
21.07.2004  
 



[quote:64eb88146a=Sebastian König]Hallo iF,
P.S.: Statt #0, #13#10 würde ich naturalmente ooo (Oktal) und xhhh (Hexadezimal) favorisieren .[/quote:64eb88146a]
Jaja, stimmt schon.

Ich hab aber schon angemerkt, das ich ESC-Seqs in Profan nicht per richtig halte. Das kommt mir so ein wenig vor wie :stream in Basic. Mir geht es also nicht darum eventuell

s$=Hx41LLO schreiben zu können, sondern s$=H+#65+LLO+#13#10

Yup, iF
 
21.07.2004  
 




Sebastian
König
Hallo iF,

[quote:905bcf7e0d]Mir geht es also nicht darum eventuell

s$=Hx41LLO schreiben zu können, sondern s$=H+#65+LLO+#13#10 [/quote:905bcf7e0d]
ok, das wäre eine gute Abkürzung per @chr$()!

MfG

Sebastian
 
Windows XP, XProfan/Profan² 4.5 bis 11
Profan2Cpp-Homepage:  [...] 
Alte Profan²-Seite:  [...] 
21.07.2004  
 



Zum Quelltext


Topictitle, max. 100 characters.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Topic-Options

6.024 Views

Untitledvor 0 min.
Sven Bader24.09.2021
Björn Haupt20.05.2021
Georg06.04.2020
Andre Rohland19.02.2018
Di più...

Themeninformationen

Dieses Thema hat 2 subscriber:

unbekannt (5x)
Sebastian König (4x)


Admins  |  AGB  |  Applications  |  Autori  |  Chat  |  Informativa sulla privacy  |  Download  |  Entrance  |  Aiuto  |  Merchantportal  |  Impronta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Giochi  |  Cerca  |  Support

Ein Projekt aller XProfaner, die es gibt!


Il mio XProfan
Private Notizie
Eigenes Ablageforum
Argomenti-Merkliste
Eigene Beiträge
Eigene Argomenti
Zwischenablage
Annullare
 Deutsch English Français Español Italia
Traduzioni

Informativa sulla privacy


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie