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

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

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

Beitrag 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. <)
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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...
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
onny
Beiträge: 400
Registriert: 27.04.2005 17:50
Kontaktdaten:

Beitrag von onny »

ich finds klasse, gut gemacht und respekt !!!
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Ich verwende es für kein Projekt.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

@ HexOR: Musst du ja nicht. Das erwarte ich ja auch nicht.

@ onny: Dankeschön!
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
DrShrek
Beiträge: 1970
Registriert: 08.09.2004 00:59

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

Beitrag 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:
Zuletzt geändert von DrShrek am 12.04.2006 15:13, insgesamt 1-mal geändert.
Siehste! Geht doch....?!
PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag 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...
Benutzeravatar
Karl
Beiträge: 520
Registriert: 21.07.2005 13:57
Wohnort: zu Hause

Beitrag 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
The Kopyright Liberation Front also known as the justified ancients of Mumu!
PB 5.X
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Statt dem Gadget hätte ich lieber einen Callback gewählt.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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 ;-)
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Antworten