Seite 1 von 1

ExamineDirectory und StatusBar

Verfasst: 24.03.2013 13:15
von delikanli_19_82
hi

leute, ich brauche eure hilfe:

ich möchte mittels ExamineDirectory den Inhalt einer Verzeichnis auslesen und während dem Lese-Vorgang die einzelnen Einträge
im Statusbar anzeigen lassen.

Das Ganze läuft rekursiv ab und braucht bei komplexen Verzeichnisstrukturen entsprechend mehr Zeit. Also soll der Anwender
im Statusbar sehen können, das das Programm nicht eingefrohren ist, sondern eben die einzelnen Verzeichnisse bzw. Unterverzeichnisse durchläuft.

Hauptprozedur zum Zweck:

Code: Alles auswählen

Global NewList run_proc_dir.s()

Procedure check_sub_dirs( thisSrc.s, id.l )
  If ExamineDirectory( id, thisSrc, "*.*" )
    ; ------------------------------------------------------- ;
    StatusBarText( 0, 0, "Directory: " + thisSrc )
    ; ------------------------------------------------------- ;
    While NextDirectoryEntry(id)
      If DirectoryEntryType(id) = #PB_DirectoryEntry_Directory
        f$ = DirectoryEntryName(id)
        ; ***
        If f$ <> "." And f$ <> ".."
          If Right( thisSrc, 1 ) <> #syschar
            f$ = thisSrc + #syschar + f$
          Else
            f$ = thisSrc + f$
          EndIf
          ; ***
          AddElement( run_proc_dir() ) : run_proc_dir() = f$
          ; ***
          ; ------------------------------------------------------- ;
          StatusBarText( 0, 0, "Sub-Directory: " + f$ )
          ; ------------------------------------------------------- ;
          ; ***
          check_sub_dirs( f$, id + 1 )
        EndIf
      EndIf
    Wend
    ; ***
    FinishDirectory(id)
  EndIf
EndProcedure
habe leider zum Thematik keine brauchbare Lösung gefunden. Wäre dankbar, wenn mir jemand helfen könnte.

mfg

kurt

Re: ExamineDirectory und StatusBar

Verfasst: 24.03.2013 18:31
von matbal
Das einzige Problem, das ich sehe, ist, daß während du die Verzeichnisse einliest, nicht mehr auf Windowsnachrichten reagierst. Die einfachste Maßnahme wäre, in die Schleife WindowEvent() einzubauen, um eventuell anfallende Nachrichten abzuholen. Ungünstig ist dabei, daß du nicht auf die Events reagierst.

Besser wäre es, deine Events gleich in einer Prozedur zu verarbeiten. Diese Prozedur kannst du auch beim Einlesen der Verzeichnisse aufrufen, um auf Events zu reagieren. Im Beispiel erfolgt die Eventverarbeitung in der Prozedur DoEvents(). Sie wird im Eventloop aufgerufen, aber auch beim Einlesen der Verzeichnisse.

Code: Alles auswählen

EnableExplicit

Enumeration 
   #FormMain
   #FormMain_Button_Path
   #StatusbarMain
EndEnumeration

Declare DoEvents(timeout = #PB_Default)


Procedure FormMain_Open()
   If OpenWindow(#FormMain, 100, 100, 400, 300, "Programm", #PB_Window_SizeGadget|#PB_Window_SystemMenu)
      CreateStatusBar(#StatusbarMain, WindowID(#FormMain))
      AddStatusBarField(#PB_Ignore)
      ButtonGadget(#FormMain_Button_Path, 10, 10, 100, 25, "Verzeichnis")
   EndIf
EndProcedure
Procedure FormMain_Close()
   End
EndProcedure

Procedure ReadDirs(start$)
   Protected d, name$, fullname$
   
   d = ExamineDirectory(#PB_Any, start$, "*")
   If d
      While NextDirectoryEntry(d)
         DoEvents(0)
         If DirectoryEntryType(d) = #PB_DirectoryEntry_Directory
            name$ = DirectoryEntryName(d)
            If name$ = "." Or name$ = ".."
               Continue
            EndIf
            
            fullname$ = start$ + name$ + "\"
            StatusBarText(#StatusbarMain, 0, fullname$)
            ReadDirs(fullname$)
         EndIf
      Wend
      FinishDirectory(d)
   EndIf
   
EndProcedure
Procedure FormMain_Button_Path()
   Protected start$ = PathRequester("Startpfad auswählen", "c:\")
   
   If start$ <> ""
      DisableGadget(#FormMain_Button_Path, 1)
      ReadDirs(start$)
      DisableGadget(#FormMain_Button_Path, 0)
   EndIf
   
EndProcedure

Procedure DoEvents(timeout = #PB_Default)
   Protected event = WaitWindowEvent(timeout)
   
   Select event
      Case #PB_Event_CloseWindow
         Select EventWindow()
            Case #FormMain
               FormMain_Close()
         EndSelect
         
      Case #PB_Event_Gadget
         Select EventGadget()
            Case #FormMain_Button_Path
               FormMain_Button_Path()
         EndSelect
   EndSelect
EndProcedure

FormMain_Open()

Repeat
   DoEvents()
ForEver
Du könntest auch das Einlesen in einen Thread auslagern. Das Hauptprogramm kann weiter auf WindowsEvents reagieren. Es mußt dann eben gewartet werden, bis der Thread beendet wurde.

Re: ExamineDirectory und StatusBar

Verfasst: 24.03.2013 18:51
von delikanli_19_82
Danke matbal,

dein Tipp war sehr hilfreich.

Daran habe ich tatsächlich nicht gedacht.

:-)