Unterordner einbeziehen in Suche....

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Tafkadasom2k5
Beiträge: 1578
Registriert: 13.08.2005 14:31
Kontaktdaten:

Unterordner einbeziehen in Suche....

Beitrag von Tafkadasom2k5 »

Stumpf, stumpfer , ich...
Ich versuche gerade darüber nachzudenken, wie ich einen Ordner mit PB auswählen lassn kann, und das er alle darin enthaltenen Mp3s auflistet-aber auch die, die in den Unterordnern sitzen.

Zudem brauch ich ne Dll oder ne Lib womit man die Tags auslesen kann-hat da jemand aushilfe für mich?

Merci!
Der Marc :? :?
OpenNetworkConnection() hat geschrieben:Versucht eine Verbindung mit dem angegebenen Server aufzubauen. 'ServerName$' kann eine IP-Adresse oder ein voller Name sein (z.B.: "127.0.0.1" oder "ftp.home.net").
php-freak hat geschrieben:Ich hab die IP von google auch ned rausgefunden!
Benutzeravatar
Konne
Beiträge: 764
Registriert: 30.03.2005 02:20
Kontaktdaten:

Beitrag von Konne »

Du lässt den Ordner über nen Requester auswählen und dann ließt du den ausgewählten ordner mit den Standrt Befehlen von PB Aus.
Hilfe gibts dazu bei "FileSystem" :allright:

Ein Rekursiver Proceduren aufruf ist dafür wohl am besten geeignet...
Benutzeravatar
Tafkadasom2k5
Beiträge: 1578
Registriert: 13.08.2005 14:31
Kontaktdaten:

Beitrag von Tafkadasom2k5 »

Konne hat geschrieben:Du lässt den Ordner über nen Requester auswählen und dann ließt du den ausgewählten ordner mit den Standard Befehlen von PB Aus.
Hilfe gibts dazu bei "FileSystem" :allright:

Ein Rekursiver Prozeduren Aufruf ist dafür wohl am besten geeignet...
Aha,danke erstmal-aber-was ist ein "Rekursiver Prozeduren Aufruf"?

Gr33tz
Der Marc :oops: :oops:
OpenNetworkConnection() hat geschrieben:Versucht eine Verbindung mit dem angegebenen Server aufzubauen. 'ServerName$' kann eine IP-Adresse oder ein voller Name sein (z.B.: "127.0.0.1" oder "ftp.home.net").
php-freak hat geschrieben:Ich hab die IP von google auch ned rausgefunden!
Christian H
Beiträge: 134
Registriert: 18.10.2005 10:22
Wohnort: Welschbillig

Beitrag von Christian H »

Tafkadasom2k5 hat geschrieben: Aha,danke erstmal-aber-was ist ein "Rekursiver Prozeduren Aufruf"?
http://de.wikipedia.org/wiki/Rekursion# ... erbeispiel

Gruss Christian
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

> Aha,danke erstmal-aber-was ist ein "Rekursiver Prozeduren Aufruf"?

Eine Rekursion findet dann statt, wenn sich eine Prozedur selber aufruft.

Nachfolgend mal ein ziemlich einfach gehaltenes und unsinniges Beispiel
für eine Rekursion:

Code: Alles auswählen

Procedure Test()
  Test()
EndProcedure

Test()
wie gesagt: der Code ist ziemlich unsinnig und stürzt nach einiger Zeit mit
einem Stapelüberlauffehler ab.

Zum Thema:

Hier ein kleiner Code, der alle MP3-Dateien auf Laufwerk C ermittelt und
ausgibt. Du kannst ihn leicht an Deine Bedürfnisse anpassen:

Code: Alles auswählen

NewList myMP3.s()

Procedure SearchFile(Folder.s, Wildcard.s)
  
  Protected Search.s
  Static DirID.l
  
  If ExamineDirectory(DirID, Folder, "")
    
    DirID + 1
    
    Repeat
      
      Type = NextDirectoryEntry()
      
      If Type : Search = Trim(DirectoryEntryName()) : EndIf
      
      If Type = 2
        
        If Search <> "." And Search <> ".."
          Search = Folder + Search + "\"
          SearchFile(Search, Wildcard)
          UseDirectory(DirID - 1)
        EndIf
        
      ElseIf Type = 1
        
        If LCase(GetExtensionPart(Search)) = Wildcard
          AddElement(myMP3())
          myMP3()=Folder + Search 
        EndIf
        
      EndIf
      
    Until Type = 0
    
    DirID - 1
    
  EndIf
  
EndProcedure

SearchFile("c:\", "mp3")

ForEach myMP3()
  Debug myMP3()
Next
Grüße ... Kiffi
Benutzeravatar
Tafkadasom2k5
Beiträge: 1578
Registriert: 13.08.2005 14:31
Kontaktdaten:

Beitrag von Tafkadasom2k5 »

ah danke kiffi-bist der beste...

Achja-biste eigentlich auch "Nicht Lustig"-Fan?Hab letztens innem Buchladen gestöbert und deinen Avatar in diesen Büchern gefunden-die Bücher sind echt hammergeil!

In dem Sinne...
Der Marc :allright: :allright: :allright:
OpenNetworkConnection() hat geschrieben:Versucht eine Verbindung mit dem angegebenen Server aufzubauen. 'ServerName$' kann eine IP-Adresse oder ein voller Name sein (z.B.: "127.0.0.1" oder "ftp.home.net").
php-freak hat geschrieben:Ich hab die IP von google auch ned rausgefunden!
Benutzeravatar
Tafkadasom2k5
Beiträge: 1578
Registriert: 13.08.2005 14:31
Kontaktdaten:

Beitrag von Tafkadasom2k5 »

Ok, ich bastel mir gerade sowas was kiffi gemacht hat nach-aber habe jetzt schon ne endlosschleife..was mache ich hier falsch?

Code: Alles auswählen

Procedure Fill_ListIconGadget(Directory.s)
  Ordner = ExamineDirectory(#PB_Any,Directory,"*.mp3")
  
  Repeat 
    Test = NextDirectoryEntry()
    If Test = 1
      AddGadgetItem(#Listicon_Stick,-1,DirectoryEntryName(),Image3)
    EndIf
    If Test = 2
      AddGadgetItem(#Listicon_Stick,-1,DirectoryEntryName(),Image4)
    EndIf
    
    
  Until Test =0
  
EndProcedure
Ich komm ned weiter :freak: ..
Hock schon ne weile an dem Fehler und check ihn einfach ned.... *BUHUUU* :(

Danke für alle Rückmeldungen erstmal

DerMarc
OpenNetworkConnection() hat geschrieben:Versucht eine Verbindung mit dem angegebenen Server aufzubauen. 'ServerName$' kann eine IP-Adresse oder ein voller Name sein (z.B.: "127.0.0.1" oder "ftp.home.net").
php-freak hat geschrieben:Ich hab die IP von google auch ned rausgefunden!
Benutzeravatar
Konne
Beiträge: 764
Registriert: 30.03.2005 02:20
Kontaktdaten:

Beitrag von Konne »

Ich seh da keine Endlosschleife. Also bei mir endets wenns fertig ist.

Ich hab nur bissle deinen Code modifiziert:

Code: Alles auswählen

Procedure Fill_ListIconGadget(Directory.s)
  Ordner = ExamineDirectory(#PB_Any,Directory,"")
  
  Repeat
    Test = NextDirectoryEntry()
    If Test = 1
      Debug "File"
    EndIf
    If Test = 2
      Debug "ordner"
    EndIf
    
  Until Test =0
  
EndProcedure

Fill_ListIconGadget("C:\")
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

> Ok, ich bastel mir gerade sowas was kiffi gemacht hat nach

äääh, Dir ist aber schon klar, dass Du mit diesem Code nicht das von Dir
eingangs gewünschte Ziel ("Unterordner einbeziehen in Suche") erreichst,
oder?

Grüße ... Kiffi
Benutzeravatar
Konne
Beiträge: 764
Registriert: 30.03.2005 02:20
Kontaktdaten:

Beitrag von Konne »

Ich schreib dir jetzt mal den Code von Kifi schön hin mit komentaren dann verstehst dus vielleicht :allright:

Code: Alles auswählen

NewList myMP3.s()    ;Erstellt eine Linked List (Da sind nacher die Dateinamen drin

Procedure SearchFile(Folder.s, Wildcard.s)  ;Öffnet die Procedure Wildcard ist das was gefunden werden soll zB "mp3"
 
  Protected Search.s 
  Static DirID.l        ;Das macht das die Variable NICHT auf 0 gesetzt wird                 wenn die Procedure beendet wird. 
 
  If ExamineDirectory(DirID, Folder, "") ;Startet die Ordner durchsuchung
   
    DirID + 1  ;Ändert die DirID Variable so dass bei der Rekursiven aufrufung nicht wieder die gleiche wie zuvor genommen wird. DIES IST SEHR WICHTIG
   
    Repeat ;Startet die Schleife in der der Ordner durchsucht wird
     
      Type = NextDirectoryEntry()  ;Gibt zurückt was der Eintrag ist (Also File,Ordner oder Nichts)
     
      If Type : Search = Trim(DirectoryEntryName()) : EndIf  ;Wenn der Ordner nicht am Ende ist
     
      If Type = 2  ;Wenn Typ ein Ordner ist
       
        If Search <> "." And Search <> ".." ;Wenn der Ordner nicht ".." oder "." ist. (Das musst du machen da Windows in jedem Ordner die Ordner ".." und "." anlegt
          Search = Folder + Search + "\" ;geht einen Ordner weiter rauf
          SearchFile(Search, Wildcard)  ;Startet die Procedure nochmal !!!
          UseDirectory(DirID - 1)  ;Wenn die Procedure zuende ist wird wieder die alte DirID benutzt
        EndIf  
       
      ElseIf Type = 1 ;Wenn es ein File ist
       
        If LCase(GetExtensionPart(Search)) = Wildcard  ;Schaut ob es die Wildcard "mp3" hat. 

          AddElement(myMP3())
          myMP3()=Folder + Search  ;Wenn es die richtige Wildcard hat kommt es in die Liste
        EndIf
       
      EndIf
     
    Until Type = 0 ;Bis zum Ende des Ordners
   
    DirID - 1  ;Vom Dir eins Abziehn
   
  EndIf
 
EndProcedure

SearchFile("c:\", "mp3")        ;Procedure starten

ForEach myMP3()   ;Alle Elemente debuggen
  Debug myMP3()
Next
Antworten