Suchen per Wildcards

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.
CNESM
Beiträge: 311
Registriert: 29.08.2004 15:16
Kontaktdaten:

Suchen per Wildcards

Beitrag von CNESM »

Hallo Leute,

musste heute für unsere Abteilung ein kleines Tool bauen, das zwei Ordner (Eigener PC/ Netzwerk) aktualisiert bzw. mit gewissen Inhalten abstimmt und gegebenfalls den Netzwerk-Ordner updatet.

Die Suche ist sehr einfach aufgebaut und sollte soweit alles beinhaltet. Wäre schön, wenn ihr mal nen Blick drauf werfen könntet und falls das "OK" kommt, es der Allgemeinheit vielleicht hilft. Gibt zwar vergleichbare Dinge bereits im Forum, aber vielleicht brauchts ja einer :)

Anmerkung: Der Code wurde aufgebaut auf den Purearea.net Code von Peter Heinzig (http://purearea.net/pb/CodeArchiv/Searc ... PBFiles.pb)

Gesucht werden kann mittels folgender Wildcard-Methoden:
*ureBasic
PureBasi*
*ureBasi*
*ur*Basi*
Danke auch für mögliche Verbesserungen!

Code: Alles auswählen

Global Such$, Verz$, l , Modus
Verz$ = "C:\Testordner\"

Declare SearchAllPath(Path$,Rek,File$)
Declare SearchOnePath(Path$,Rek,File$)

If OpenWindow(0, 0, 0, 400, 480,"Suche", #PB_Window_ScreenCentered) = 0 : End : EndIf
If CreateGadgetList(WindowID(0)) = 0 : End : EndIf

ButtonGadget        (6, 290, 10,   100, 18,"Nur Hauptpfad")
ButtonGadget        (8, 290, 40,   100, 18,"Alle Unterordner")
ButtonGadget      (10, 290, 70,   100, 18,"End") 


StringGadget(11,8, 10,206,20,"*est.exe")
StringGadget(13,8, 40,206,20,"C:\Testordner\") 

x =  #PB_ListIcon_GridLines | #PB_ListIcon_AlwaysShowSelection | #PB_ListIcon_FullRowSelect 
ListIconGadget (12, 10, 125, 380, 345,"Ergebnisse", 800, x)

Repeat
   Event = WaitWindowEvent()   
   If  Event = #PB_Event_Gadget Or Event =  #PB_Event_Menu
      Select EventGadget()
   
         Case 6   ;----------------------------------------------------------- Button VerzeichnisWahl 

                  ClearGadgetItemList(12) : SearchOnePath(GetGadgetText(13), 0, GetGadgetText(11)) 
                  
            
         Case 8   ;----------------------------------------------------------- Button Suchen

                  ClearGadgetItemList(12) : SearchAllPath(GetGadgetText(13),0,GetGadgetText(11)) 

         Case 10
         
         End


            
      EndSelect
   EndIf
Until Event = #PB_Event_CloseWindow 
End


Procedure SearchAllPath(Path$,Rek,File$)
If ExamineDirectory(Rek,Path$,"")=0
   MessageRequester("Error!","Path checking failed!",0)
Else
   Repeat
      Typ=NextDirectoryEntry(Rek):Name$=DirectoryEntryName(Rek)
      If Typ=1
         If CountString(File$,"*")=0
            If Typ=1 And Name$=File$
                If ReadFile(0,Path$+Name$)
                   AddGadgetItem(12,-1,Path$+Name$)
                Else
                   MessageRequester("Error!","No file(s) found!",0)
                EndIf
            EndIf
         ElseIf CountString(File$,"*")=3 And Left(File$,1)="*" And Right(File$,1)="*"
               NewPos=1
               StarPosition=1
               Found=1
               NewFile$=RemoveString(File$,"*")
               For A=1 To Len(NewFile$)
                   If Found=0
                      Break
                   ElseIf Found=1
                      NewNewFile$=Mid(NewFile$,StarPosition,1)
                      Pos=FindString(Name$,NewNewFile$,NewPos)

                      If Pos=0
                         NewPos=NewPos+1
                         Found=0
                      Else
                         NewPos=Pos+1
                         StarPosition=StarPosition+1
                         Found=1
                      EndIf
                   EndIf
                Next
                If Found=1
                   AddGadgetItem(12,-1,Path$+Name$+" ?")
                EndIf
         ElseIf Left(File$,1)="*" And Right(File$,1)="*"
                NewFile$=RemoveString(File$,"*")
                If FindString(Name$,NewFile$,1)=0
                ElseIf FindString(Name$,NewFile$,1)<>0
                    AddGadgetItem(12,-1,Path$+Name$)
                EndIf
         ElseIf Left(File$,1)="*"
                NewFile$=RemoveString(File$,"*")
                If FindString(Name$,NewFile$,1)=0
                ElseIf FindString(Name$,NewFile$,1)<>0
                    AddGadgetItem(12,-1,Path$+Name$)
                EndIf
         ElseIf Right(File$,1)="*"
                NewFile$=RemoveString(File$,"*")
                If FindString(Name$,NewFile$,1)=0
                ElseIf FindString(Name$,NewFile$,1)<>0
                    AddGadgetItem(12,-1,Path$+Name$)
                EndIf
         ElseIf FindString(File$,"*",1)<>0
               Pos=FindString(File$,"*",1)
               If Left(File$,Pos-1)=Left(Name$,Pos-1)
                  Length=Len(File$)-Pos
                  If Right(File$,Length)=Right(Name$,Length) 
                     AddGadgetItem(12,-1,Path$+Name$)
                  EndIf
               
               EndIf
         EndIf
    ElseIf Typ=2 And Name$<>"."And Name$<>".."
         SearchAllPath(Path$+Name$+"\",Rek+1,File$)
    EndIf
  Until Typ=0
EndIf
EndProcedure 


Procedure SearchOnePath(Path$,Rek,File$)
If ExamineDirectory(Rek,Path$,"")=0
   MessageRequester("Error!","Path checking failed!",0)
Else
   Repeat
      Typ=NextDirectoryEntry(Rek):Name$=DirectoryEntryName(Rek)
      If Typ=1
         If CountString(File$,"*")=0
            If Typ=1 And Name$=File$
                If ReadFile(0,Path$+Name$)
                   AddGadgetItem(12,-1,Path$+Name$)
                Else
                   MessageRequester("Error!","No file(s) found!",0)
                EndIf
            EndIf
         ElseIf CountString(File$,"*")=3 And Left(File$,1)="*" And Right(File$,1)="*"
               NewPos=1
               StarPosition=1
               Found=1
               NewFile$=RemoveString(File$,"*")
               For A=1 To Len(NewFile$)
                   If Found=0
                      Break
                   ElseIf Found=1
                      NewNewFile$=Mid(NewFile$,StarPosition,1)
                      Pos=FindString(Name$,NewNewFile$,NewPos)

                      If Pos=0
                         NewPos=NewPos+1
                         Found=0
                      Else
                         NewPos=Pos+1
                         StarPosition=StarPosition+1
                         Found=1
                      EndIf
                   EndIf
                Next
                If Found=1
                   AddGadgetItem(12,-1,Path$+Name$+" ?")
                EndIf
         ElseIf Left(File$,1)="*" And Right(File$,1)="*"
                NewFile$=RemoveString(File$,"*")
                If FindString(Name$,NewFile$,1)=0
                ElseIf FindString(Name$,NewFile$,1)<>0
                    AddGadgetItem(12,-1,Path$+Name$)
                EndIf
         ElseIf Left(File$,1)="*"
                NewFile$=RemoveString(File$,"*")
                If FindString(Name$,NewFile$,1)=0
                ElseIf FindString(Name$,NewFile$,1)<>0
                    AddGadgetItem(12,-1,Path$+Name$)
                EndIf
         ElseIf Right(File$,1)="*" 
                NewFile$=RemoveString(File$,"*")
                If FindString(Name$,NewFile$,1)=0
                ElseIf FindString(Name$,NewFile$,1)<>0
                    AddGadgetItem(12,-1,Path$+Name$)
                EndIf
         ElseIf FindString(File$,"*",1)<>0 
               Pos=FindString(File$,"*",1)
               If Left(File$,Pos-1)=Left(Name$,Pos-1)
                  Length=Len(File$)-Pos
                  If Right(File$,Length)=Right(Name$,Length) 
                     AddGadgetItem(12,-1,Path$+Name$)
                  EndIf
               
               EndIf
         EndIf
     EndIf
  Until Typ=0
EndIf
EndProcedure 
Zuletzt geändert von CNESM am 22.01.2007 17:28, insgesamt 1-mal geändert.
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1765
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Beitrag von Andre »

In der Ereignisschleife muss

Code: Alles auswählen

Until Event = 0
in

Code: Alles auswählen

Until Event = #PB_Event_CloseWindow
umgeändert werden.

Dann läufts in PB 4.02 :)
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

Hey cool. Schau ich mir heute Abend (nach 18 Uhr) mal näher an. Sieht toll
aus :D. *thread in bookmarks speicher*
Bild
CNESM
Beiträge: 311
Registriert: 29.08.2004 15:16
Kontaktdaten:

Beitrag von CNESM »

@ Andre

Tja, irgendwas musst du auch immer finde, gell :D

@ MVXA

:)
Benutzeravatar
TomS
Beiträge: 1508
Registriert: 23.12.2005 12:41
Wohnort: München

Beitrag von TomS »

Cool! Danke für's posten :allright:
Bräuchte noch ne Option für CaseSensitive (isses nämlich Standardmäßig)^^

@Andre: Danke, wer weiß wie lange ich als Supernoob gebraucht hätte, herauszufinden, woran es liegt, dass sich da kein Fenster öffnet bzw. gleich wieder schließt.
CNESM
Beiträge: 311
Registriert: 29.08.2004 15:16
Kontaktdaten:

Beitrag von CNESM »

@ TomS

Was mir jetzt spontan einfallen würden, wäre die API Funktion "Comparestring". Hab da noch was im Hinterkopf aus Profan-Zeiten.

*KurzBeiGoogleSchau*

Hier der Link:

http://www.dieterzornow.gmxhome.de/quell.html

Such mal nach: CompareString

Damit sollte man zwei Strings vergleichen können. Werd mir die Tage nochmal Zeit nehmen, sofern ich dazu komme, und das ganze noch mit einbauen :)

@ Andre

Habs angepasst :)
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

> Damit sollte man zwei Strings vergleichen können.
Ich weiß nicht, ob's zum Thema passt, aber: Willst du Strings, die Wildcards enthalten, vergleichen? Also möchtest du zum Beispiel prüfen ob
"G*gle" und "Google" oder "G*gle" und "Goooogle" übereinstimmen? Dann habe ich hier etwas für dich:
http://www.purebasic.fr/german/viewtopi ... ight=AND51
Prüft Strings mit Wildcards, wobei du das Wildcard frei wählen darfst (erfordert PB 4+).

NickTheQuick hat auch eine Procedure dazu geschrieben, aber die habe ich leider nicht gefunden.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

AND51 hat geschrieben:NickTheQuick hat auch eine Procedure dazu geschrieben, aber die habe ich leider nicht gefunden.
http://www.purebasic.fr/german/viewtopi ... 091#106091

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
TomS
Beiträge: 1508
Registriert: 23.12.2005 12:41
Wohnort: München

Beitrag von TomS »

Ne es ging mir nur darum, dass "*.mp3" auch nur alle "*.mp3" auflistet und nicht auch alle *.MP3". Sollte sich machen lassen. wenn man irgendwo ein paar kleine LCase() einbaut...
CNESM
Beiträge: 311
Registriert: 29.08.2004 15:16
Kontaktdaten:

Beitrag von CNESM »

Scheinbar wurde das Vergleichen von Strings schon gut durch AND51 und NickTheQuick umgesetzt. Die Beispiele sollten dementsprechend auch genutzt werden :) Im Grunde musst du einfach vor jeder AddGadgetItem Geschichte noch eine Abfrage starten und die beiden Strings, also File$ bzw. NewFile$ und Name$, vergleichen.

Mit LCase() und UCase() konvertierst du Strings in klein bzw. GROSSBUCHSTABEN, ein Vergleich ist damit aber wohl nicht möglich.
Antworten