Seite 1 von 4

Ordnerinhalt inkl Unterordner in eine Text Datei speichern

Verfasst: 26.12.2016 06:28
von udg
Ich hab hier Probleme Ordner mit Unterordner einzulesen und die darin befindlichen Dateien in eine Text Datei zu speichern. Später möchte ich per Checkbox diverse Endungen von der Suche ausklammern wollen.
Wärend des scannens soll noch ein Progressbar rein.

Wie wende ich denn recursive an, dass wirklich alle Unterverzeichnisse erfasst werden? Darüber finde ich in der Hilfe nichts.
Beim speichern der Text Datei wird immer nur die letze Datei des ersten Ordner als Text hineingespeichert. Nicht der komplette Ordnerinhalt :(

NACHTRAG:

inzwischen habe ich alles so weit fertig dass es mir die Text Datei mit Unterverzeichnisse erstellt.

jetzt noch die Checkboxen Aktivieren und einen Progressbar rein.

CODE AKTUALISIERT (dickes Danke auch an Bisonte)
PureBasic v5.43 LTS - Compiler Option hab ich eingestellt: Create Unicode executable

Code: Alles auswählen

EnableExplicit

;{ Enumeration Section
Enumeration Windows
  #Window_0
EndEnumeration
Enumeration Gadgets
  #Button_Start
  #String_Path
  #Button_Ordner
  #CheckBox_srt
  #CheckBox_jpg
  #CheckBox_bmp
  #CheckBox_mp3
  #LineTopEdFrame
  #LineLeftEdFrame
  #LineRightEdFrame
  #LineBottomEdFrame
  #Gadget_LineLeftEdFrame
  #Gadget_LineRightEdFrame
  #Gadget_LineBottomEdFrame
  #Gadget_LineTopEdFrame
  #Frame_Text
  #Frame3D
  #CheckBox_Custom
  #String_Custom
  #Inhalt_txt
  #Container_CheckboxenUSW
  #Header
  #Exit_btn
  #Gadget_exit
  #CheckBox_srt_Text
  #CheckBox_jpg_Text
  #CheckBox_bmp_Text
  #CheckBox_mp3_Text
  #Img_Fat_Line
  #Fat_Line
  #Triangle
  #Gadget_Triangle
  #Img_Footer
  #Footer
  #Triangle_Button
  #Gadget_Triangle_Button
  #LineTop
  #LineLeft
  #LineRight
  #LineBottom
  #Gadget_LineTop
  #Gadget_LineLeft
  #Gadget_LineRight
  #Gadget_LineBottom
  #Footer_Text
EndEnumeration
Enumeration Fonts
  #Font1
  #Font2
  #Font3
  #PB_Atny
EndEnumeration
;}

Global Path$, File2$, InitialPath$, Dir$, File$, font$
Define.i Event, EventWindow, EventGadget, EventType, EventMenu, Start, Stop 
Define NewList Files.s()
Define NewList Clean.s()

LoadFont(#Font1, "Microsoft Sans Serif", 9, #PB_Font_HighQuality)
LoadFont(#Font2, "Microsoft Sans Serif", 12, #PB_Font_HighQuality)


Procedure IncTextGadget(Gadget, x, y, Width, Height, Text$, Flags, FColor.l = -1, BColor.l = -1, FontID = 0)
  
  Protected ID
  
  ID = TextGadget(Gadget, x, y, Width, Height, Text$, Flags)
  If Gadget = #PB_Any : Gadget = ID : EndIf
  
  If FColor > -1
    SetGadgetColor(Gadget, #PB_Gadget_FrontColor, FColor)
  EndIf
  If BColor > -1
    SetGadgetColor(Gadget, #PB_Gadget_BackColor, BColor)
  EndIf
  
  If FontID <> 0
    SetGadgetFont(Gadget, FontID)
  EndIf
  
  ProcedureReturn ID
  
EndProcedure
Procedure ExamDir(Directory.s, List Files.s())
  
  Protected Dir, Name.s
  
  If Right(Directory, 1) <> "\" : Directory + "\" : EndIf ; add Backslash if no one exist
  
  Dir = ExamineDirectory(#PB_Any, Directory, "")
  
  If Dir
    While NextDirectoryEntry(Dir)
      Name = DirectoryEntryName(Dir)
      If DirectoryEntryType(Dir) = #PB_DirectoryEntry_Directory
        If Name <> "." And Name <> ".."
          ExamDir(Directory + Name, Files())
        EndIf
      Else
        AddElement(Files()) ; create a new listElement
        Files() = Directory + Name
      EndIf  
      While WindowEvent() : Wend
    Wend
    FinishDirectory(Dir)
  EndIf
  
EndProcedure
Procedure WriteDirText(File.s, List Files.s())
  
  Protected A
  Protected txt$
  txt$ = FormatDate("%dd.%mm.%yyyy um %hh:%ii:%ss", Date())
  If ListSize(Files()) > 0 ; is there something in the list?
    A = CreateFile(#PB_Any, File)
    If a 
      WriteStringN(A, "")
      WriteStringN(A, "Folder2Text-Tool by udg aka inc in 2016")
      WriteStringN(A, LSet("", 63, "-"))
      WriteStringN(A, "Übersicht der eingelesenen Ordner vom " + txt$)
      WriteStringN(A, "")
      WriteStringN(A, LSet("", 63, "-"))
      WriteStringN(A, "")
      WriteStringN(A, "")
      ForEach Files()
        WriteStringN(A, Files())
      Next
      CloseFile(A)
      SetGadgetText(#Button_Start, "Text Datei gespeichert")
    EndIf
  EndIf
  
EndProcedure
Procedure RemoveFromList(List Files.s(), List Clean.s(), Extension.s)
  
  ForEach Files()
    If LCase(GetExtensionPart(Files())) <> LCase(Extension)
      AddElement(Clean())
      Clean() = Files()
    EndIf
  Next
  
EndProcedure
Procedure StringGadgetVCenter(GadgetID)
  Protected hwndEdit
  Protected LineCount
  Protected hdc
  Protected fsz.SIZE
  Protected eRect.RECT
  
  hwndEdit = GadgetID(GadgetID)
  
  LineCount = SendMessage_(hwndEdit,#EM_GETLINECOUNT, 0, 0)
  
  hdc = GetDC_(hwndEdit)
  SelectObject_(hdc,GetGadgetFont(GadgetID))
  GetTextExtentPoint32_(hdc,"ABC",3,fsz.SIZE)
  ReleaseDC_(hwndEdit,hdc)   
  
  GetClientRect_(hwndEdit,eRect.RECT)
  eRect\top = (GadgetHeight(GadgetID) - fsz\cy * LineCount) / 2
  eRect\bottom = eRect\top + (fsz\cy * LineCount) + 4
  
  If eRect\bottom < GadgetHeight(GadgetID)
    SendMessage_(hwndEdit,#EM_SETRECT,0,eRect)
  EndIf
EndProcedure
Procedure OpenWindow_Window_0()
  Protected FColor
  Protected BColor
  
  If OpenWindow(#Window_0, 965, 377, 415, 450, "", #PB_Window_BorderLess|#PB_Window_ScreenCentered|#PB_Window_Invisible)
    SetWindowColor(0, RGB(128, 128, 128))
    SetClassLongPtr_(WindowID(0), #GCL_STYLE, #CS_DROPSHADOW)
    
    ;1px FRAME TOOL EDGES
    ;LineLeft
    CreateImage(#LineTop,415,1,32,RGB(40,40,40))
    StartDrawing(ImageOutput(#LineTop))
    StopDrawing()
    ;LineLeft
    CreateImage(#LineLeft,1,450,32,RGB(40,40,40))
    StartDrawing(ImageOutput(#LineLeft))
    StopDrawing()
    ;LineRight
    CreateImage(#LineRight,1,450,32,RGB(40,40,40))
    StartDrawing(ImageOutput(#LineRight))
    StopDrawing()
    ;LineBottom
    CreateImage(#LineBottom,415,1,32,RGB(145, 30, 135))
    StartDrawing(ImageOutput(#LineBottom))
    StopDrawing()
    
    ImageGadget(#Gadget_LineTop,0,0,1,415,ImageID(#LineTop))
    ImageGadget(#Gadget_LineLeft,0,0,1,500,ImageID(#LineLeft))
    ImageGadget(#Gadget_LineRight,414,0,1,500,ImageID(#LineRight))
    ImageGadget(#Gadget_LineBottom,1,449,415,1,ImageID(#LineBottom)) 
    
    ;HEADER
    IncTextGadget(#Header, 0, 0, 355, 61, "  Ordnerinhalt in TXT Datei schreiben", #SS_CENTERIMAGE, RGB(187, 187, 187), RGB(40,40,40), FontID(#Font2))
    ;HEADER BORDER BOTTOM  
    CreateImage(#Img_Fat_Line, 414, 5)
    StartDrawing(ImageOutput(#Img_Fat_Line))
    Box(0,0,OutputWidth(),OutputHeight(),RGB(40,40,40))
    StopDrawing()
    ImageGadget(#Fat_Line, 1, 61, 0, 0, ImageID(#Img_Fat_Line))
    DisableGadget(#Fat_Line, #True)
    ;TRIANGLE
    CreateImage(#Triangle,394,11,32,RGB(128, 128, 128))
    StartDrawing(ImageOutput(#Triangle))
    ;LINE LEFT
    LineXY(0, 0, 10, 10, RGB(40, 40, 40))
    ;LINE RIGHT
    LineXY(10, 10, 20, 0, RGB(40, 40, 40))
    ;PINK LINE RIGHT
    LineXY(11, 11, 21, 0, RGB(145, 30, 134))
    LineXY(0, 0, 394, 0, RGB(145, 30, 134))
    ;LINE TOP
    LineXY(0, 0, 20, 0, RGB(40, 40, 40))
    FillArea(3, 2, RGB(40, 40, 40), RGB(40, 40, 40))
    StopDrawing()
    ImageGadget(#Gadget_Triangle,20,66,39,394,ImageID(#Triangle))
    
    ;EXIT BUTTON
    CreateImage(#Exit_btn,60,61)
    StartDrawing(ImageOutput(#Exit_btn))
    FillArea(1,1,-1,RGB(40, 40, 40))
    Line(3,56,54,-54,RGB(208, 208, 208))
    Line(3,4,54,54,RGB(208, 208, 208))
    StopDrawing()
    ImageGadget(#Gadget_exit,WindowWidth(0)-60,0,60,60,ImageID(#Exit_btn))
    
    ContainerGadget(#Container_CheckboxenUSW, 24, 80, 380, 324, #PB_Container_BorderLess)
    SetGadgetColor(#Container_CheckboxenUSW, #PB_Gadget_BackColor, RGB(128, 128, 128))
    
    ;FRAME AROUND THE CHECKBOXES
    ;LineTop
    CreateImage(#LineTopEdFrame,371,1,32,RGB(102, 102, 102))
    StartDrawing(ImageOutput(#LineTopEdFrame))
    StopDrawing()
    ;LineLeftEdFrame
    CreateImage(#LineLeftEdFrame,1,40,32,RGB(102, 102, 102))
    StartDrawing(ImageOutput(#LineLeftEdFrame))
    StopDrawing()
    ;LineRightEdFrame
    CreateImage(#LineRightEdFrame,1,40,32,RGB(102, 102, 102))
    StartDrawing(ImageOutput(#LineRightEdFrame))
    StopDrawing()
    ;LineBottomEdFrame
    CreateImage(#LineBottomEdFrame,370,1,32,RGB(102, 102, 102))
    StartDrawing(ImageOutput(#LineBottomEdFrame))
    StopDrawing()
    
    CheckBoxGadget(#CheckBox_srt, 10, 35, 13, 13, "")
    IncTextGadget(#CheckBox_srt_Text, 26, 32, 25, 16, "srt", 0, -1, RGB(128, 128, 128), FontID(#Font1))
    
    CheckBoxGadget(#CheckBox_jpg, 55, 35, 13, 13, "")
    IncTextGadget(#CheckBox_jpg_Text, 71, 32, 25, 16, "jpg", 0, -1, RGB(128, 128, 128), FontID(#Font1))
    
    CheckBoxGadget(#CheckBox_bmp, 100, 35, 13, 13, "")
    IncTextGadget(#CheckBox_bmp_Text, 117, 32, 27, 16, "bmp", 0, -1, RGB(128, 128, 128), FontID(#Font1))
    
    CheckBoxGadget(#CheckBox_mp3, 147, 35, 13, 13, "")
    IncTextGadget(#CheckBox_mp3_Text, 163, 32, 27, 16, "mp3", 0, -1, RGB(128, 128, 128), FontID(#Font1))
    
    CheckBoxGadget(#CheckBox_Custom, 234, 35, 13, 13, "")
    StringGadget(#String_Custom, 250, 32, 105, 18, "Endung angeben", #PB_String_BorderLess|#ES_MULTILINE|#SS_CENTER)
    SetGadgetFont(#String_Custom, FontID(#Font1))
    StringGadgetVCenter(#String_Custom) 
    SetGadgetColor(#String_Custom, #PB_Gadget_FrontColor, RGB(136, 136, 136))
    
    ;OPEN PATH BUTTON
    IncTextGadget(#Button_Ordner, 0, 100, 367, 30, "Ordner/ Verzeichnis wählen", #SS_CENTERIMAGE|#SS_NOTIFY|#SS_CENTER, RGB(40, 40, 40), RGB(177, 177, 177), FontID(#Font2))
    ;SHOW PATH
    StringGadget(#String_Path, 0, 148, 367, 35, "", #PB_String_BorderLess|#ES_MULTILINE|#SS_CENTER)
    SetGadgetFont(#String_Path, FontID(#Font1))
    StringGadgetVCenter(#String_Path)   
    
    ;START BUTTON
    IncTextGadget(#Button_Start, 0, 290, 367, 30, "Starten", #SS_CENTERIMAGE|#SS_NOTIFY|#SS_CENTER, RGB(40, 40, 40), RGB(177, 177, 177), FontID(#Font2))
    
    CloseGadgetList()
    
    ;TRIANGLE BOTTOM - START BUTTON
    CreateImage(#Triangle_Button,30,14,32,RGB(128, 128, 128))
    StartDrawing(ImageOutput(#Triangle_Button))
    ;DARK LINE LEFT
    LineXY(1, 0, 13, 12, RGB(16, 16, 16))
    ;LINE LEFT
    LineXY(3, 0, 13, 10, RGB(177, 177, 177))
    ;LINE RIGHT
    LineXY(13, 10, 23, 0, RGB(177, 177, 177))
    ;Dark LINE RIGHT
    LineXY(14, 11, 25, 0, RGB(16, 16, 16))
    ;LINE TOP
    LineXY(3, 0, 23, 0, RGB(177, 177, 177))
    FillArea(6, 2, RGB(177, 177, 177), RGB(177, 177, 177))
    StopDrawing()
    ImageGadget(#Gadget_Triangle_Button,192,210,39,30,ImageID(#Triangle_Button))
    
    ;DRAW 1px FRAME AROUND THE CHECKBOXES
    ImageGadget(#Gadget_LineTopEdFrame,22,100,1,1,ImageID(#LineTopEdFrame))
    ImageGadget(#Gadget_LineLeftEdFrame,22,101,1,101,ImageID(#LineLeftEdFrame))
    ImageGadget(#Gadget_LineRightEdFrame,392,101,1,101,ImageID(#LineRightEdFrame))
    ImageGadget(#Gadget_LineBottomEdFrame,23,140,1,101,ImageID(#LineBottomEdFrame)) 
    
    IncTextGadget(#Frame_Text, 30, 90, 180, 16, " ignoriere folgende Datei Typen:", 0, RGB(217, 217, 217), RGB(128, 128, 128), FontID(#Font1))
    
    ;FOOTER
    CreateImage(#Img_Footer, 450, 30)
    StartDrawing(ImageOutput(#Img_Footer))
    Box(0,0,OutputWidth(),OutputHeight(),RGB(40,40,40))
    StopDrawing()
    ImageGadget(#Footer, 0, WindowHeight(0) - 31, 0, 0, ImageID(#Img_Footer)) : DisableGadget(#Footer, #True)
    ;FOOTER TEXT
    IncTextGadget(#Footer_Text, 95, 423, 220, 20, "coding by unknown design group 2k16", #SS_CENTERIMAGE|#SS_CENTER, RGB(95, 95, 95), RGB(40,40,40), FontID(#Font1))
    
    HideWindow(#Window_0, #False)
    
  Else
    End
  EndIf
  
EndProcedure

OpenWindow_Window_0()

Repeat
  Event = WaitWindowEvent()
  Select Event
      
    Case #PB_Event_Gadget
      EventGadget = EventGadget()
      EventType = EventType()
      
      Select EventGadget()
        ;AUTOHIGHLIGHT TEXT IN STRINGGADGET onCLICK  
        Case #String_Custom
          If EventType() = #PB_EventType_Focus
            SendMessage_(GadgetID(EventGadget()), #EM_SETSEL, Len(GetGadgetText(EventGadget())), 0)
            SetGadgetColor(#String_Custom, #PB_Gadget_FrontColor, RGB(40,40,40))
          EndIf  
          
        Case #Button_Ordner
          SetGadgetText(#Button_Start, "Starten")
          InitialPath$ = "C:\"
          Dir$ = PathRequester("Bitte Pfad auswählen", InitialPath$)
          If Dir$
            SetGadgetText(#String_Path, Dir$)
          EndIf  
          
        Case #Button_Start
          
          ;CALL SAVE FILE REQUESTER 
          File$=SaveFileRequester("Info Datei speichern", "C:\info.txt ", "TXT FILE(*.txt)|*.txt", 0)   
          
          If File$ <> "" And Dir$ <> ""
            If Right(Dir$,1)<>"\":Dir$+"\":EndIf
            ClearList(Files())
            ClearList(Clean())
            ExamDir(Dir$, Files())

            If GetGadgetState(#CheckBox_bmp)
              RemoveFromList(Files(), Clean(), "bmp")
              ClearList(Files()) : CopyList(Clean(), Files()) : ClearList(Clean())
            EndIf
            If GetGadgetState(#CheckBox_jpg)
              RemoveFromList(Files(), Clean(), "jpg")
              ClearList(Files()) : CopyList(Clean(), Files()) : ClearList(Clean())
            EndIf        
            If GetGadgetState(#CheckBox_mp3)
              RemoveFromList(Files(), Clean(), "mp3")
              ClearList(Files()) : CopyList(Clean(), Files()) : ClearList(Clean())
            EndIf         
            If GetGadgetState(#CheckBox_srt)
              RemoveFromList(Files(), Clean(), "srt")
              ClearList(Files()) : CopyList(Clean(), Files()) : ClearList(Clean())
            EndIf 
            If GetGadgetState(#CheckBox_Custom)
              RemoveFromList(Files(), Clean(), GetGadgetText(#String_Custom))
              ClearList(Files()) : CopyList(Clean(), Files()) : ClearList(Clean())
            EndIf 

            WriteDirText(File$, Files())
            
          EndIf
          
        Case #Gadget_exit
          End
      EndSelect
      
      
      ;DRAG TOOL WITH MOUSE
    Case #WM_LBUTTONDOWN
      If WindowMouseX(#Window_0) >= 0 And WindowMouseX(#Window_0) <= 355 And WindowMouseY(#Window_0) >= 0 And WindowMouseY(#Window_0) <= 61
        SendMessage_(WindowID(#Window_0), #WM_NCLBUTTONDOWN, #HTCAPTION, 0)
      EndIf 
  EndSelect
  
ForEver

Re: Ordnerinhalt inkl Unterordner in eine Text Datei speiche

Verfasst: 26.12.2016 12:09
von man-in-black
Hi,

Rekursiv ist im grunde nichts anderes als selbstaufrufend. Das heißt, du solltest es erstmal
als eigenständige procedure verpacken. Innerhalb dieser gehst du dann so wie dus schon hast
alle ordnereinträge durch. Wenn du dann nen ordner findest, rufst du deine procedure auf und
übergibst den neuen pfad. Stells dir wie ein baum mit verzweigten ästen vor.
Jeder knoten/ordner entspricht einem procedureaufruf. Code gibts nicht.
Ist vom handy etwas zu umständlich. Findest aber auch
Bei purearea, was du brauchst.

MFG
MIB

Re: Ordnerinhalt inkl Unterordner in eine Text Datei speiche

Verfasst: 26.12.2016 14:51
von ts-soft
Genau, so im EventLoop ohne Procedure wird das eher nichts! Einfach mal suchen. Gibt hier genug Sourcen im Forum, sowie im
englischem Forum, CodeArchiv usw.

Re: Ordnerinhalt inkl Unterordner in eine Text Datei speiche

Verfasst: 26.12.2016 15:51
von udg
Danke für eure Antworten.
Ich hab gestern so lange nach Beispielen gesucht, dass ich dann aufgegeben habe. Natürlich nichts gefunden und deshalb einmal die Frage gestellt.
Irgend wann weiß man nicht mehr was in die Suche eingetippt werden kann um Infos zu finden.
Grüße

Re: Ordnerinhalt inkl Unterordner in eine Text Datei speiche

Verfasst: 26.12.2016 17:05
von udg
hab den Code umgeschrieben und Proceduren angepasst

Re: Ordnerinhalt inkl Unterordner in eine Text Datei speiche

Verfasst: 26.12.2016 17:21
von man-in-black
Hi,

dein code zeigt jetzt nicht viel neues ;)
Guck dir einfach mal das olle Beispiel an:
http://www.purebasic.fr/english/viewtopic.php?t=6064

MFG
MIB

Re: Ordnerinhalt inkl Unterordner in eine Text Datei speiche

Verfasst: 26.12.2016 18:42
von udg
siehe erster Post...

Re: Ordnerinhalt inkl Unterordner in eine Text Datei speiche

Verfasst: 26.12.2016 19:41
von man-in-black
[OT] kleiner tipp. Es ist zwar nett, wenn du deinen code teilst, aber machs bitte nicht bei jedem
kleinen zwischenstand. Das bringt nicht viel Mehrwert, bläht den Thread dennoch auf.
Es ist übersichtlicher, wenn du deinen ersten Post anpasst. IMHO [/OT]
Bin daher jetzt auch nicht sicher, ob mit deinem letzten Beitrag eine Frage verbunden ist?
Damits nicht vollständig OT ist noch ein Tipp zur Progressbar. Lager deine Rekursion in einen
Thread aus. Dein Hauptthread kann dann ungestört Events abarbeiten und das Fenster neu zeichnen.
Das Problem gabs neulich schonmal an anderer Stelle im Forum.

MFG
MIB

Re: Ordnerinhalt inkl Unterordner in eine Text Datei speiche

Verfasst: 26.12.2016 19:44
von Micha122
Hi udg,
also bei mir friert das Fenster ein (keine Rückmeldung). :oops:

Die Eventschleife mag ja funktionieren .......eben Geschmacksache. Ich persönlich bevorzuge BindEvent().
Was das einfrieren des Fensters anbelangt, würde ich zu Threaded raten. Die Eventschleife wird zu lange verlassen.
übrigens, ich lese hier mit weil ich das Thema auch noch nicht so ganz kapiert habe. Die meisten Treffer zu "recursive" sind leider uralt.

Grüße, Michael

Re: Ordnerinhalt inkl Unterordner in eine Text Datei speiche

Verfasst: 26.12.2016 22:53
von udg
Micha122 hat geschrieben:Hi udg,
also bei mir friert das Fenster ein (keine Rückmeldung). :oops:

Die Eventschleife mag ja funktionieren .......eben Geschmacksache. Ich persönlich bevorzuge BindEvent().
Was das einfrieren des Fensters anbelangt, würde ich zu Threaded raten. Die Eventschleife wird zu lange verlassen.
übrigens, ich lese hier mit weil ich das Thema auch noch nicht so ganz kapiert habe. Die meisten Treffer zu "recursive" sind leider uralt.

Grüße, Michael
kannst Du nochmal den Code aus Beitrag 1 testen?

hab hier keine Probleme . Läuft
Mit Threads hab ich kaum Plan da bräucht ich Hilfe.