Seite 1 von 2

Eine Datei oder ein Verzeichnis suchen... So gehts!

Verfasst: 10.04.2006 20:38
von AND51
Hallo!

Hier ein erneuter Versuch, ein Code zu veröffentlichen, der keiner Verbesserung bedarf :wink:

Code: Alles auswählen

Procedure.s suche(Pfad.s, DateiOderVerzeichnis.s, Gadget.l)
	Protected verzeichnis.l, element.s, temp$
	verzeichnis=ExamineDirectory(#PB_Any, Pfad, "")
	If verzeichnis And DateiOderVerzeichnis <> "" And DateiOderVerzeichnis <> "." And DateiOderVerzeichnis <> ".." And DateiOderVerzeichnis <> "\"
		Repeat
			UseDirectory(verzeichnis)
			Select NextDirectory()
				Case 0	; Wenn keine weiteren Einträge
					ProcedureReturn ""
				Case 1
					If Right(DateiOderVerzeichnis, 1) <> "\"	; Wenn eine Datei gesucht wird
						If IsGadget(Gadget)
							SetGadgetText(Gadget, Pfad+DirectoryEntryName())
						EndIf
						If UCase(DirectoryEntryName()) = UCase(DateiOderVerzeichnis)	; Wenn Datei gefunden
							ProcedureReturn Pfad+DirectoryEntryName()
						Else	; Wenn Datei nicht gefunden
							Delay(1)
							Continue
						EndIf
					EndIf
				Case 2
					If Right(DateiOderVerzeichnis, 1) = "\" And UCase(DirectoryEntryName()) = UCase(Left(DateiOderVerzeichnis, Len(DateiOderVerzeichnis)-1))
						If IsGadget(Gadget)	; ^--- Wenn ein Ordner gesucht wird und gefunden wurde
							SetGadgetText(Gadget, Pfad+DirectoryEntryName()+"\")
						EndIf
						ProcedureReturn Pfad+DirectoryEntryName()+"\"
					Else	; Wenn Ordner gesucht wird aber nicht gefunden wurde gehe in diesen Ordner (Rekursion) und suche weiter
						If IsGadget(Gadget)
							SetGadgetText(Gadget, Pfad+DirectoryEntryName()+"\")
						EndIf
						Delay(1)
						temp$=suche(Pfad+DirectoryEntryName()+"\", DateiOderVerzeichnis, Gadget)
						If temp$	; Wenn in einem Unterordner etwas gefunden wurde, dann gehe wieder hoch zum Ausgangspunkt und gebe ihn aus
							ProcedureReturn temp$
						Else
							If IsGadget(Gadget)
								SetGadgetText(Gadget, "")
							EndIf
						EndIf
					EndIf
			EndSelect
		ForEver						
	Else
		If IsGadget(Gadget)
			SetGadgetText(Gadget, "")
		EndIf
		ProcedureReturn ""
	EndIf
EndProcedure
Hiermit kann in Pfad nach der gewünschten DateiOderVerzeichnis gesucht werden. Auf Wunsch kann der aktuell durchsuchte Ordner oder die Datei in ein Gadget geschrieben werden. Wenn das nicht erwünscht ist, einfach eine ungültige GadgetID angeben.

Soll nach einer Datei gesucht werden, den Dateinamen als 2. Parameter angeben.
Soll nach einem Ordner gesucht werden, den Ordnernamen als 2. Parameter angeben und sofern nötig ein Backslash anhängen ("\"), wie es in PB üblich ist. Bitte nicht sowas: "Mein Ordner\Unterordner\"!!

Bei Pfad, dem 1. Parameter, das Startverzeichnis angeben, das durchsucht werden soll, hier kann auch ein Laufwerk C:\ oder E:\ stehen.

Die Prozedur schützt sich vor Veräppelungen durch den benutzer und erkennt, ob das zu durchsuchende Verzeichnis nicht vorhanden ist, oder als Verzeichnis ein Leerstring oder "." und ".." und "\" übergeben wurden und gibt in dem Fall sofort kein rgebnis zurück. Einzig durch mehrere "\\" kann die Prozedur ausgetrickst werden und sucht sich dann nen Wolf ;-)


Ich hoffe, diese Prozedur gefällt euch. <)

Verfasst: 11.04.2006 19:26
von AND51
Hat keiner eine Meinung zu meinem Werk! Egal ob Lob oder Tadel... Ihr könnt mir ja auch verraten, ob/in welchem Projekt ihr des benutzt...

Verfasst: 12.04.2006 09:32
von onny
ich finds klasse, gut gemacht und respekt !!!

Verfasst: 12.04.2006 13:10
von HeX0R
Ich verwende es für kein Projekt.

Verfasst: 12.04.2006 15:10
von AND51
@ HexOR: Musst du ja nicht. Das erwarte ich ja auch nicht.

@ onny: Dankeschön!

Re: Eine Datei oder ein Verzeichnis suchen... So gehts!

Verfasst: 12.04.2006 15:12
von DrShrek
AND51 hat geschrieben:Hier ein erneuter Versuch, ein Code zu veröffentlichen, der keiner Verbesserung bedarf :wink:
Hier ein Verbesserungsvorschlag:
Umschreiben in PB4 Syntax... :wink:

Verfasst: 12.04.2006 15:12
von HeX0R
Ich hab ja auch nur wie gewünscht geantwortet ;)
AND51 hat geschrieben:... Ihr könnt mir ja auch verraten, ob/in welchem Projekt ihr des benutzt...

Verfasst: 12.04.2006 15:47
von Karl
Dat mit dem Gadget würde ich lassen. Ist unnötiger Code - der Programmierer weiss in der Regel selbst, ob er eins verwendet oder nicht.

Aber ich verwende das Ding nur in abgewandelter Form.

Gruß Karl

Verfasst: 12.04.2006 16:42
von DarkDragon
Statt dem Gadget hätte ich lieber einen Callback gewählt.

Verfasst: 12.04.2006 21:46
von AND51
Danke für eure Antworten!

@ HexOR: Du hast gewonnen! :allright:

@ Karl: Das mit dem gadget habe ich gemacht, damit der Programmierer, der den Code bei sich einsetzt, seinem User, der hinterher seine Software benutzt evtl. zeigen kann, in welchem Verzeichnis er sucht.

@ DarkDragon: Gute Idee! Ich glaube, das mache ich auch. Aber ich habe mich mit Callbacks noch nie wirklich beschäftigt. Ich weiß "nur" dies: Ein Callback ist eine Prozedur, die bei jedem Arbeitsschritt zum Beispiel beim Packen angegeben werden kann und aufgerufen wird. Callbacks wird i. d. R. ein @ Vorangestellt. Aber selbst, wenn ich das mit den Callbacks mache, wie rufe ich dann eine übergebene Prozedur auf?

@ Dr. Shrek: Ich wollte es so versuchen, dass dieser Code in PB 3.94 und in PB 4.00 verwendet werden kann. Es nutzt keine Befehle, die in PB 4.00 anders sind oder fehlen.

Nochmals danke für eure Beiträge! Aber wenn noch einer was sagen will, nur zu ;-)