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
:wink:

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::wink:

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
:allright:

Verfasst: 21.06.2008 13:49
von AND51
Kai, jetzt wird gepointert. :lol:
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. :lol:
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. :lol:

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.