Seite 1 von 2

Suchen per Wildcards

Verfasst: 18.01.2007 17:09
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 

Verfasst: 21.01.2007 18:23
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 :)

Verfasst: 22.01.2007 01:31
von MVXA
Hey cool. Schau ich mir heute Abend (nach 18 Uhr) mal näher an. Sieht toll
aus :D. *thread in bookmarks speicher*

Verfasst: 22.01.2007 09:05
von CNESM
@ Andre

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

@ MVXA

:)

Verfasst: 22.01.2007 16:17
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.

Verfasst: 22.01.2007 17:24
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 :)

Verfasst: 22.01.2007 17:55
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.

Verfasst: 22.01.2007 18:12
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

Verfasst: 22.01.2007 18:25
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...

Verfasst: 23.01.2007 09:34
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.