Seite 1 von 2
wie Dateien ohne endung auflisten?
Verfasst: 20.06.2008 18:07
von FrEeKsTeR
Hallo alle zusammen *g* ich bin neu hier, Anfänger und hab nen kleines Problem *g*. ich versuche mir mittels Programm eine Text Datei anzulegen und die einträge in einem Verzeichniss rein schreiben zu lassen. Das klappt auch alles Wunderbar, mein Problem ist jetzt ich möchte die einträge ohne Endung in der Text Datei haben. Gibt es irgend eine Möglichkeit die Datei Endungen zu entfernen ? Habe über die Suche nicht wirklich etwas zu diesem Thema gefunden. Ich würde mich über Hilfe sehr freuen
mfg FrEeKsTeR
Verfasst: 20.06.2008 18:11
von STARGÅTE
Code: Alles auswählen
Procedure.s OhneEndung(DateiName$)
ProcedureReturn Left(DateiName$, Len(DateiName$)-Len(GetExtensionPart(DateiName$))-1)
EndProcedure
Debug OhneEndung("C:\Mein Ordner\MeineDatei.Meins")
Einfach die Dateiändung ermitteln (GetExtensionPart) und dann vom Namen wegschneiden
Verfasst: 20.06.2008 18:20
von FrEeKsTeR
das war ja mal ne schnelle antwort vielen dank *g*
Verfasst: 20.06.2008 23:17
von Kai
STARGÅTE hat geschrieben:
Code: Alles auswählen
Procedure.s OhneEndung(DateiName$)
ProcedureReturn Left(DateiName$, Len(DateiName$)-Len(GetExtensionPart(DateiName$))-1)
EndProcedure
Debug OhneEndung("C:\Mein Ordner\MeineDatei.Meins")
Einfach die Dateiändung ermitteln (GetExtensionPart) und dann vom Namen wegschneiden
Kleiner Denkfehler, wenn keine Erweiterung existiert, ziehst du vom eigentlichen Dateiname trotzdem ein Zeichen ab.
Habs ma bissl umgebaut.
Code: Alles auswählen
Procedure.s OhneEndung(DateiName$)
Protected sResult.s
If GetExtensionPart(DateiName$) <> ""
sResult = Left(DateiName$, Len(DateiName$)-Len(GetExtensionPart(DateiName$))-1)
Else
sResult = Left(DateiName$, Len(DateiName$)-Len(GetExtensionPart(DateiName$)))
EndIf
ProcedureReturn sResult
EndProcedure
Verfasst: 21.06.2008 02:16
von AND51
Kai, habe deins mal ein bisschen umgebaut.
Mein Code ist doppelt so schnell wie deiner und übersichtlicher:
Code: Alles auswählen
Procedure.s OhneEndung(File.s)
Protected length.l=Len(GetExtensionPart(File))
If length
ProcedureReturn Left(File, Len(File)-length-1)
EndIf
ProcedureReturn File
EndProcedure
Verfasst: 21.06.2008 09:03
von Kai
AND51 hat geschrieben:Kai, habe deins mal ein bisschen umgebaut.
Mein Code ist doppelt so schnell wie deiner und übersichtlicher:
Code: Alles auswählen
Procedure.s OhneEndung(File.s)
Protected length.l=Len(GetExtensionPart(File))
If length
ProcedureReturn Left(File, Len(File)-length-1)
EndIf
ProcedureReturn File
EndProcedure
War eh nur so auf der schnelle hingeklatscht und sollte als Beispiel dienen.
Code: Alles auswählen
Procedure.s GetFileNamePart(File$)
If File$
Protected *C.Character = @File$
If *C
Protected a.l, flen.l = Len(File$) - 1, epos.l, clen.l = SizeOf(Character)
*C = @File$ + (flen * clen)
epos = *C
For a = flen To 0 Step -1
If *C\c = '\' Or *C\c = '/'
If epos = 0: epos = a + 1: EndIf
Break
ElseIf *C\c = '.'
epos = a
EndIf
*C - clen
Next
ProcedureReturn PeekS(@File$, epos)
EndIf
EndIf
EndProcedure

Verfasst: 21.06.2008 13:49
von AND51
Kai, jetzt wird gepointert.
Hier, mein Code ist geringfügig schneller als deiner und außerdem ist er mal stark vereinfacht:
Code: Alles auswählen
Procedure.s OhneEndung(File.s)
Protected *point.Character=@File
*point+MemoryStringLength(*point)<<#PB_Compiler_Unicode-SizeOf(Character)
While *point\c
If *point\c = '.'
ProcedureReturn PeekS(@File, (*point-@File)>>#PB_Compiler_Unicode)
ElseIf *point\c = '\' Or *point\c = '/'
ProcedureReturn File
EndIf
*point-SizeOf(Character)
Wend
ProcedureReturn File
EndProcedure
Verfasst: 21.06.2008 14:03
von marco2007
...und And51's Code funkt auch bei z.B.: "name.Punkt.endung". Also bei Dateinamen mit Punkten...
Verfasst: 21.06.2008 15:01
von Kai
AND51 hat geschrieben:Kai, jetzt wird gepointert.
Hier, mein Code ist geringfügig schneller als deiner und außerdem ist er mal stark vereinfacht:
Code: Alles auswählen
Procedure.s OhneEndung(File.s)
Protected *point.Character=@File
*point+MemoryStringLength(*point)<<#PB_Compiler_Unicode-SizeOf(Character)
While *point\c
If *point\c = '.'
ProcedureReturn PeekS(@File, (*point-@File)>>#PB_Compiler_Unicode)
ElseIf *point\c = '\' Or *point\c = '/'
ProcedureReturn File
EndIf
*point-SizeOf(Character)
Wend
ProcedureReturn File
EndProcedure
Schon ok, ich geb mich einfach mal geschlagen.

Verfasst: 21.06.2008 15:13
von AND51
Du musst dich nicht geschlagen geben! Ich nehme gern jede Herausforderung an.
Ich möchte dir mal einen Tipp geben, kai.
Im Prinzip haben unsere Codes die gleiche vorgehensweise: Von hinten anfangen zu parsen. Allerdings Benutzt du allein schon mehrere Variablen, ich nur eine (den Pointer).
Deine
For-Schleife habe ich durch
While ersetzt, das macht deine Zählvaraible ebenfalls überflüssig.
For durch
While zu ersetzen ist meiner Meinung nach auch praktischer zu handhaben.
Und deine ganzen Abfragen (If *C, If File$, If *C\c, ElseIf) hab ich durch drei Abfragen ersetzt: While, If und ElseIf, mehr ist ja nicht nötig.
Sachen wie
SizeOf(Character) musst du nicht zwischenspeichern, dies sind konstante Werte, sie werden beim Kompilieren direkt durch ihren Wert ersetzt. Eine Konstanten in einer Variablen zu speichern ist also auch nicht nötig.